2016-09-16 74 views
1

我試圖將下面的代碼轉換爲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

第二個問題更有意義,我不是第一個,但是我怎樣才能解決實際的錯誤呢?我並不打算成爲勺子代碼,而是試圖找出錯誤存在的原因以及滿足錯誤併產生期望結果的原因。謝謝:)

+0

你說「雨燕2.2」?你有沒有有效的Swift 2.2代碼?雖然代碼很容易修復,但我建議將它翻譯出來,然後逐行開始新的轉換。還要注意,代碼似乎使用了未公開記錄的符號。如果您打算將此內容提交給App Store,這可能會有問題。 – Arthur

+0

@Arthur My Swift 2.2代碼無效,但它有不同的錯誤消息。我試圖從目標c一行一行地走,但是這兩條線仍然給我帶來麻煩。我參考的帖子中有一位用戶說,他們成功地通過了一個只有這個應用的應用,這意味着私有符號已經很好的暴露了,所以...... idk。 – WillB

回答

0

idk如果它適合你。但我有同樣的問題,我的作品 嘗試使用的NSArray,而不是AnyObject

let subviews: NSArray = (((app.value(forKey: "statusBar"))! as NSArray).value(forKey: "foregroundView"))!.subviews 
var dataNetworkItemView: NSString?