查看SwiftyJSON字典是否具有密钥的最佳实践

tom*_*obi 23 swift swifty-json

我正在尝试找到一种方法来获取SwiftyJSON字典中的键的值,并返回一个默认字符串,如果未设置该键.以下示例工作正常,但我并不满意.你知道更优雅的方式吗?

例:

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": "three"]
]

for (key: String, user: JSON) in users {      
    println(user.object.objectForKey("name") != nil
        ? user["name"].stringValue
        : "default")
}
Run Code Online (Sandbox Code Playgroud)

cia*_*uri 27

最新 SwiftyJSON的版本具有的exists()功能.

注意:他们最新的文档并没有很好地反映代码......实际的方法是exists()

// Returns boolean

json["name"].exists()
Run Code Online (Sandbox Code Playgroud)


rin*_*aro 9

看来,SwiftyJSON errorsubscript不存在键时设置属性.

所以,这应该有效:

for (key: String, user: JSON) in users {
    let name = user["name"];
    println(name.error == nil ? name.stringValue : "default")
}
Run Code Online (Sandbox Code Playgroud)

例如:w/Version 6.1.1(6A2006),SwiftyJSON github current master:

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": NSNull()],
    ["id": 4, "name": "four"],
]

for (key: String, user: JSON) in users {
    let name = user["name"];
    name.isEmpty
    println(name.error == nil ? name.stringValue : "default")
}
Run Code Online (Sandbox Code Playgroud)

打印:

one
default

four
Run Code Online (Sandbox Code Playgroud)


Ene*_*nso 6

如果您需要检查SwiftyJSON字典是否有密钥,可以将其与JSON.null以下内容进行比较:

user["name"] == JSON.null // true if the key does not exist
Run Code Online (Sandbox Code Playgroud)

使用该方法,您的代码可能如下所示:

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": "three"]
]

for (key, user) in users {
    print(user["name"] != JSON.null ? user["name"].stringValue : "default")
}
Run Code Online (Sandbox Code Playgroud)

如果您只想提供默认值,那么您可以在Swift()中使用Nil Coalescing Operator,??如下所示:

let users: JSON = [
    ["id": 1, "name": "one"],
    ["id": 2],
    ["id": 3, "name": "three"]
]

for (key, user) in users {
    print(user["name"].string ?? "default")
}
Run Code Online (Sandbox Code Playgroud)

SwiftJSON提供了string方法,该方法返回一个可选的value(String?),相反,stringValue它总是返回一个String.