Swift可选nil检查返回与实际情况不同的结果

时间:2016-07-21 05:26:11

标签: swift

taker是一本字典。当我检查taker["user_id"]的零值时。它说这不是零。但是当我解开它时它实际上包含空值。这是我的调试器输出。这怎么可能?

Debugger output

2 个答案:

答案 0 :(得分:2)

po taker["user_id"]为您提供正确的答案:Some: <null>表示可空值中的内容为null。即使没有Foundation互操作,您也可以使用可选值的字典(例如[Int: Int?])获得类似的内容,在这种情况下,下标的结果类型将为Int??)。

但是,在您的情况下,“只是”可选项中的对象是NSNull()的实例。 NSNull是一种特殊类型,您可以在nil不可接受的地方使用。例如,Objective-C NSDictionaries不支持nil值(因为它们返回nil表示字典中不存在的键)。如果您想发出NSDictionary密钥存在但没有价值的信号,最常见的做法是将其与NSNull值相关联。

我怀疑taker是一个源自JSON的字典。除了存在的密钥之外,您应该检查该值是否具有您期望的类型。这将清除NSNull以及可能的其他错误输入。例如:

if let value = taker["user_id"] as? Int {
    // things here
}

答案 1 :(得分:1)

可能是这种情况

您的词典包含NSNull()作为值

let dictionary: [String: AnyObject] = ["id": NSNull()]

if dictionary["id"] == nil {
    print("is Nil")
}else {
    print("Not Nil")  // prints:  Not Nil as this is true 
}

print(dictionary["id"]) // Optional(<null>)