我试图将下面的代码转换为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