检测NSDictionary中的Null值

时间:2014-06-03 23:24:43

标签: ios swift nsnull

我有一个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。

6 个答案:

答案 0 :(得分:86)

您可以使用as?运算符,该运算符返回一个可选值(如果向下转发失败,则为nil

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

我在swift应用程序中测试了这个例子

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!"

答案 1 :(得分:33)

您还可以使用<body> <div class="element"> (everything else inside here) </div> </body> 检查是否存在null:

is

答案 2 :(得分:11)

我正在使用这些组合。另外,该组合检查对象是否不是"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
}

它不像扩展那么漂亮,但却起到了魅力:)

答案 3 :(得分:9)

NSNull是一个与其他类似的类。因此,您可以使用isas来测试针对它的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的工作应用程序,并说明了完整的通用技术。

答案 4 :(得分:7)

我现在的解决方案:

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

    return (someObject is NSNull)
}
到目前为止,测试看起来不错......

tests look good so far

答案 5 :(得分:3)

我有一个非常类似的问题,并通过强制转换为原始NSDictionary值的正确类型来解决它。如果您的服务返回类似这样的混合类型JSON对象

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

你必须获取它的价值。

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

这确实解决了我的问题。见BAD_INSTRUCTION within swift closure