如何检查一个字段类型为 Any? 是否为 nil 或 NSNull

5

我正在尝试在Xcode8.1上使用Swift3解析Json对象。

这是我的代码:

if let objData = objJson["DATA"] as! NSDictionary? {
    var msg: String = ""
    if let tmp = objData.object(forKey: "Message") { 
        msg = tmp as! String
    } else {
        print("NIIILLLLL")
    }
}

我收到了这个错误信息:Could not cast value of type 'NSNull' (0x4587b68) to 'NSString' (0x366d5f4),它显示在这行代码:msg = tmp as! String
我不明白为什么会出现这个错误,因为tmp的类型是Any,它应该显示打印结果而不是将tmp as! String转换为字符串类型。
谢谢您的帮助,
3个回答

4
你可以在let中添加类型转换。
if let tmp = objData.object(forKey: "Message") as? String { 
    msg = tmp
}

1
例如,使用Swift 3:
fileprivate var rawNull: NSNull = NSNull()
public var object: Any {
   get {
      return self.rawNull
   }
}

您可以这样检查字段对象:

if self.object is NSNull {
  // nil
}

obj是NSNull就是解决方案。 - tedyyu
很不幸,我的应用程序在使用is NSNull时崩溃,并显示错误信息:Thread 1: "-[NSNull _fastCStringContents:]: unrecognized selector sent to instance - Ben Butterworth

0
所以回答你的问题,为什么会出现那个错误,在你的代码中,“tmp”不是nil,而是NSNull类型的某个东西(如果你想了解更多关于NSNull的信息,请查看文档),但它基本上是“用于表示不允许nil值的集合对象中的null值的单例对象。” 其余部分只是你在强制转换,我建议避免这样做,这是一种更安全的方式来完成你正在做的事情。
guard let objData = objJson["DATA"] as? [String: Any], let msg = objData["Message"] else { return }
// now you can use msg only if exists and also important keeping its unmutable state

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接