我有一个NSDictionary
来自API服务器的JSON响应.有时候这个字典中的键的值是Null
我试图获取给定的值并将其放入表格单元格的详细文本中以供显示.
问题在于,当我试图将值强制转换NSString
为崩溃时,我认为这是因为我试图强制Null
转换为字符串.
这样做的正确方法是什么?
我想做的是这样的:
cell.detailTextLabel.text = sensor.objectForKey( "latestValue" ) as NSString
这是一个字典的例子:
Printing description of sensor: { "created_at" = "2012-10-10T22:19:50.501-07:00"; desc = ""; id = 2; "latest_value" = " "; 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.
您还可以使用is
检查是否存在null:
if sensor["latestValue"] is NSNull { // do something with null JSON value here }
NSNull是一个像任何其他类一样的类.因此,您可以使用is
或as
测试AnyObject引用.
因此,在我的一个应用程序中,我有一个NSArray,其中每个条目都是Card或NSNull(因为你不能把nil放在NSArray中).我将NSArray作为一个数组取出并循环通过它,切换我得到的对象类型:
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的工作应用程序,并说明了完整的通用技术.
您可以使用as?
运算符,它返回一个可选值(nil
如果向下转换失败)
if let latestValue = sensor["latestValue"] as? String { cell.detailTextLabel.text = latestValue }
我在一个快速的应用程序中测试了这个例子
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!"
按预期打印.
我现在的解决方案:
func isNull(someObject: AnyObject?) -> Bool { guard let someObject = someObject else { return true } return (someObject is NSNull) }
到目前为止测试看起来不错
我正在使用这些组合.另外,该组合检查对象是否不是"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 }
它不是那么漂亮,但作为魅力工作:)