[NSNull length]:发送到实例0x10f8c6fc0'的无法识别的选择器;swift 4 iOS

[NSNull length]:发送到实例0x10f8c6fc0'的无法识别的选择器;swift 4 iOS,ios,swift4,xcode10,Ios,Swift4,Xcode10,我以这种方式从模型中获取数据 if let birthdate = personInfo?.str_Birthdate { cell.dobTF.text = birthdate } 但应用程序崩溃并返回此错误 “-[NSNull length]:发送到实例0x10f8c6fc0的选择器无法识别” 您在这里看到的是NSNull。它是一个对象,在objective-C数组和字典的上下文中表示null。特别是在JSON中,它区分接收字段(null),而不是根本不接收字段。在您的例子中,我假

我以这种方式从模型中获取数据

if let birthdate = personInfo?.str_Birthdate {
    cell.dobTF.text = birthdate
}
但应用程序崩溃并返回此错误

“-[NSNull length]:发送到实例0x10f8c6fc0的选择器无法识别”


您在这里看到的是
NSNull
。它是一个对象,在objective-C数组和字典的上下文中表示
null
。特别是在JSON中,它区分接收字段
(null)
,而不是根本不接收字段。在您的例子中,我假设这个值是强制展开为字符串的,因此错误有点晚。请尝试以下操作:

if let dateObject = personInfo?.str_Birthdate {
    if let nullObject = dateObject as? NSNull {
        // A field was returned but is (null)
    } else if let stringObject = dateObject as? String {
        cell.dobTF.text = stringObject
    } else {
        // Unknown object
    }
} else {
    // This field is missing
}
实际上,您可以使用以下方法将所有
NSNull
实例转换为
nil

func removeNSNullInstancesFrom(_ item: Any?) -> Any? {
    guard let item = item else { return nil }
    if let _ = item as? NSNull {
        return nil
    } else if let array = item as? [Any] {
        return array.compactMap { removeNSNullInstancesFrom($0) }
    } else if let dictionary = item as? [String: Any] {
        var newDict: [String: Any] = [String: Any]()
        dictionary.forEach { item in
            guard let value = removeNSNullInstancesFrom(item.value) else { return }
            newDict[item.key] = value
        }
        return newDict
    } else {
        return item
    }
}
您可以在整个响应对象或特定项上使用它。在您的情况下,您可以执行以下操作:
cell.dobTF.text=removeNSNullInstancesFrom(birthdate)


但是这种方法通常应该递归地从JSON标准的字段、数组和字典中删除所有的
NSNull
实例。

看起来
stru Birthdate
NSNull
,而不是字符串实例。值从何而来?请显示
str_Birthdate
的值从何而来基本上str_Birthdate有nsnull值,但不知道如何处理it@EneaDume它是objective c模型nsstring属性。我知道这没有值,但问题是如何在上面添加nsnull值的检查。如果让birthdate=personInfo?崩溃。str_birthdate是类型推断导致不必要行为的一个很好的例子。