在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是一个类似的任何其他。 因此,您可以使用is
或as
来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