我试图找到一种方法来获取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")
}
答案 0 :(得分:26)
SwiftyJSON的latest版本具有exists()
功能。
注意:他们最新的文档并没有很好地反映代码...实际方法是exists()
// Returns boolean
json["name"].exists()
答案 1 :(得分:9)
看来,当error
不存在密钥时,SwiftyJSON会设置subscript
属性。
所以,这应该有效:
for (key: String, user: JSON) in users {
let name = user["name"];
println(name.error == nil ? name.stringValue : "default")
}
例如: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")
}
打印:
one
default
four
答案 2 :(得分:6)
如果您需要检查SwiftyJSON
字典是否有密钥,可以将其与JSON.null
进行比较,如下所示:
user["name"] == JSON.null // true if the key does not exist
使用该方法,您的代码可能如下所示:
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")
}
如果您只想提供默认值,那么您可以使用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")
}
SwiftJSON提供string
方法,该方法返回一个可选值(String?
),与stringValue
相反,后者始终返回String
。
答案 3 :(得分:1)
JSON
类型的对象具有名为null
的计算属性。如果请求的元素不存在,则返回NSNull
,如果是,则返回nil
。因此,您可以通过从其父JSON
中提取特定对象并测试以查看是否存在null
属性来测试是否存在特定对象。我亲自处理它:
let object = json["key"]
if object.null == nil {
// Do something with 'object'
} else {
// Key does not exist - handle the error
}
在您的具体情况下,您可以使用:
for (key: String, user: JSON) in users {
let name = user.object.objectForKey("name")
println(name.null == nil ? name.stringValue : "default")
}
...但是因为我们知道我们正在寻找一个字符串,所以我们可以进一步减少它。您实际需要做的就是删除stringValue
的“值”部分,因为string
如果无法从其内容生成字符串,则返回nil。另外,请查看nil coalescence运算符??
。它旨在为可选变量提供默认值,请尝试以下操作:
for (key: String, user: JSON) in users {
println(user["name"].string ?? "default")
}
美观而紧凑!
答案 4 :(得分:-1)
注意:此答案不再有效
似乎完全使用if let
语法。因为访问下标将返回一个可选项,所以将其绑定到if let
块中的变量。这将告诉你密钥是否在JSON
。
if let name = user["name"] { // returns optional
// user["name"] was non-nil, is now stored in ``name""
// do something with ``name""
}
else {
// user did not have key "name"
// here would be the place to return "default"
// or do any other error correction if the key did not exist
}