【问题标题】:Complex line warns: AnyObject is not a subtype of NSObject复杂行警告:AnyObject 不是 NSObject 的子类型
【发布时间】:2016-09-16 04:59:29
【问题描述】:

我正在尝试将以下代码转换为 Swift 3。其目的是将蜂窝信号强度打印到控制台。可以在 here 找到 StackOverflow 帖子。

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 从 Swift 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)")

第二行(let subviews: ...)抛出错误:

'(AnyObject)' is not a subtype of 'NSObject'

倒数第二行 (let signalStrength = ...) 会引发以下警告:

Left side of nil coalescing operator '??' has non-optional type 'NSString' so the right side is never used

第二个问题对我来说比第一个更有意义,但我该如何解决实际错误呢?我不打算成为勺子喂养的代码,而是试图找出错误存在的原因以及什么可以满足错误并产生所需的结果。谢谢:)

【问题讨论】:

  • 你说的是“Swift 2.2”?你有可以继续使用的有效 Swift 2.2 代码吗?虽然代码很容易修复,但我建议您将其撕掉并自己逐行开始新的转换。另请注意,代码似乎使用了未公开记录的符号。如果您打算将其提交到 App Store,这可能会出现问题。
  • @Arthur My Swift 2.2 代码也无效,但它有不同的错误消息。我正在尝试从目标 c 逐行进行,但这两条线仍然给我带来麻烦。我引用的帖子中有一个用户说他们成功通过了一个只有这个的应用程序的审查,这意味着私有符号暴露得很好,所以...... idk。

标签: ios objective-c swift compiler-errors nsobject


【解决方案1】:

idk 如果它适合你。但我遇到了同样的问题,它对我有用 尝试使用 NSArray 而不是 AnyObject

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多