我試圖將下面的代碼轉換爲Swift 3.其目的是將蜂窩信號強度打印到控制檯。這個StackOverflow的帖子來自可以發現here。複雜的行警告:AnyObject不是NSObject的子類型
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSString *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]])
{
dataNetworkItemView = subview;
break;
}
}
int signalStrength = [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue];
NSLog(@"signal %d", signalStrength);
而且,我自己嘗試(SWIFT是新的我),一些在線轉換器,以及Xcode的雨燕從2.2至3自動轉換後,我是堅持了兩個問題。這是目前問題的代碼:
let app = UIApplication.shared
let subviews: NSArray = (((app.value(forKey: "statusBar"))! as AnyObject).value(forKey: "foregroundView"))!.subviews
var dataNetworkItemView: NSString?
for subview in subviews {
if (subview as AnyObject).isKind(of: NSClassFromString("UIStatusBarSignalStrengthItemView")!) {
dataNetworkItemView = subview as? String as NSString?
break
}
}
let signalStrength = Int(((dataNetworkItemView!.value(forKey: "signalStrengthRaw") as! String) as NSString ?? "0").intValue)
print("signal \(signalStrength)")
第二行(讓子視圖:...)拋出的錯誤:
'(AnyObject)' is not a subtype of 'NSObject'
和倒數第二行(讓signalStrength = .. 。)拋出以下警告:
Left side of nil coalescing operator '??' has non-optional type 'NSString' so the right side is never used
第二個問題更有意義,我不是第一個,但是我怎樣才能解決實際的錯誤呢?我並不打算成爲勺子代碼,而是試圖找出錯誤存在的原因以及滿足錯誤併產生期望結果的原因。謝謝:)
你說「雨燕2.2」?你有沒有有效的Swift 2.2代碼?雖然代碼很容易修復,但我建議將它翻譯出來,然後逐行開始新的轉換。還要注意,代碼似乎使用了未公開記錄的符號。如果您打算將此內容提交給App Store,這可能會有問題。 – Arthur
@Arthur My Swift 2.2代碼無效,但它有不同的錯誤消息。我試圖從目標c一行一行地走,但是這兩條線仍然給我帶來麻煩。我參考的帖子中有一位用戶說,他們成功地通過了一個只有這個應用的應用,這意味着私有符號已經很好的暴露了,所以...... idk。 – WillB