2016-09-16 62 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?