[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是类型推断导致不必要行为的一个很好的例子。