[英]Detect a Null value in NSDictionary
我有一个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 = "<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?
operator,返回一个可选值(如果downcast失败则为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!"
正如所料。
您还可以使用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
来测试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的工作应用程序,并说明了完整的通用技术。
我有一个非常类似的问题,并通过强制转换为原始NSDictionary值的正确类型来解决它。 如果您的服务返回这样的混合类型JSON对象
{"id":2, "name":"AC Vent Temp", ...}
你必须得到它的价值。
var id:int = sensor.valueForKey("id") as Int;
var name:String? = sensor.valueForKey("name") as String;
这确实解决了我的问题。 请参阅swift闭包中的BAD_INSTRUCTION
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.