在NSDictionary中检测一个Null值

我有一个从API服务器的JSON响应填充的NSDictionary 。 有时这个字典中的键的值是Null

我正在尝试将给定的值放到表格单元格的细节文本中进行显示。

问题是,当我试图强制NSString的价值,我得到一个崩溃,我认为是因为我试图强制Null到一个string。

什么是正确的方法来做到这一点?

我想要做的是这样的:

 cell.detailTextLabel.text = sensor.objectForKey( "latestValue" ) as NSString 

这里是一个字典的例子:

 Printing description of sensor: { "created_at" = "2012-10-10T22:19:50.501-07:00"; desc = "<null>"; id = 2; "latest_value" = "<null>"; name = "AC Vent Temp"; "sensor_type" = temp; slug = "ac-vent-temp"; "updated_at" = "2013-11-17T15:34:27.495-07:00"; } 

如果我只是需要在条件中包装所有这一切,那很好。 我只是无法弄清楚有什么条件。 回到Objective-C世界,我会比较[NSNull null]但似乎并没有在Swift中工作。

你可以使用as? 运算符,它返回一个可选值(如果downcast失败,则nil

 if let latestValue = sensor["latestValue"] as? String { cell.detailTextLabel.text = latestValue } 

我在一个快速的应用程序中testing了这个例子

 let x: AnyObject = NSNull() if let y = x as? String { println("I should never be printed: \(y)") } else { println("Yay") } 

并正确地打印"Yay" ,而

 let x: AnyObject = "hello!" if let y = x as? String { println(y) } else { println("I should never be printed") } 

打印"hello!" 如预期。

你也可以使用is检查是否存在null:

 if sensor["latestValue"] is NSNull { // do something with null JSON value here } 

我正在使用这些组合。 另外,组合检查对象是否不是"null"

 func isNotNull(object:AnyObject?) -> Bool { guard let object = object else { return false } return (isNotNSNull(object) && isNotStringNull(object)) } func isNotNSNull(object:AnyObject) -> Bool { return object.classForCoder != NSNull.classForCoder() } func isNotStringNull(object:AnyObject) -> Bool { if let object = object as? String where object.uppercaseString == "NULL" { return false } return true } 

这不像扩展名那样漂亮,但作为魅力:)

NSNull是一个类似的任何其他。 因此,您可以使用isas来testingAnyObject引用。

因此,在我的应用程序之一,我有一个NSArray,其中每个条目是一个卡或NSNull(因为你不能把一个NSArray无)。 我作为一个数组获取NSArray并循环,切换哪种types的对象,我得到:

 for card:AnyObject in arr { switch card { // how to test for different possible types case let card as NSNull: // do one thing case let card as Card: // do a different thing default: fatalError("unexpected object in card array") // should never happen! } } 

这与你的场景不一样,但是它是从一个工作的应用程序转换到Swift,并说明了完整的通用技术。

我的解决scheme现在:

 func isNull(someObject: AnyObject?) -> Bool { guard let someObject = someObject else { return true } return (someObject is NSNull) } 

目前testing看起来不错…

目前测试看起来不错

我有一个非常类似的问题,并解决了铸造到原始NSDictionary值正确的types。 如果你的服务返回这样的混合types的JSON对象

 {"id":2, "name":"AC Vent Temp", ...} 

你必须得到这样的价值。

 var id:int = sensor.valueForKey("id") as Int; var name:String? = sensor.valueForKey("name") as String; 

这确实解决了我的问题。 请参阅快速closures中的BAD_INSTRUCTION