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")
}
SwiftyJSONの latest バージョンには、exists()
関数があります。
[〜#〜] note [〜#〜]:最新のドキュメントにはコードがあまり反映されていません...実際のメソッドはexists()
// Returns boolean
json["name"].exists()
SwiftyJSONは、error
が存在しない場合にsubscript
プロパティを設定するようです。
したがって、これは動作するはずです:
for (key: String, user: JSON) in users {
let name = user["name"];
println(name.error == nil ? name.stringValue : "default")
}
例:w /バージョン6.1.1(6A2006)、SwiftyJSON github現在のマスター:
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
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")
}
デフォルト値のみを提供する場合は、次のように Nil Coalescing Operator in Swift(??
)を使用できます。
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
メソッドを提供し、常にstringValue
を返すString
とは対照的に、オプションの値(String?
)を返します。
タイプ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
はコンテンツから文字列を生成できない場合はnilを返すため、実際に必要なことはstring
の 'Value'部分をドロップすることだけです。また、nil合体演算子??
。オプション変数のデフォルトを提供するように設計されているので、これを試してください:
for (key: String, user: JSON) in users {
println(user["name"].string ?? "default")
}
素敵でコンパクト!
私が知る限り、これは機能します:
let users: JSON = [
["id": 1, "name": "one"],
["id": 2],
["id": 3, "name": "three"]
]
for jsonDict in users.arrayValue {
println(jsonDict["name"].string ?? "default")
}
説明するには、JSON
オブジェクトを、取得する予定の型にキャストします。タイプを常に成功させる(オプションではない)場合は、xxxValue
を使用します。したがって、arrayValue
を使用してルートオブジェクトをキャストします。
arrayValue
は[JSON]
を返します。これはループ内を移動します。 SwiftyJSONは、添字演算子からのdictであると仮定するのに十分なほど賢いので、jsonDict: JSON
をオブジェクトに変換する必要はありません。
最後に、dictからキーを取得し、オプションの.string
を使用してキーを文字列として取得できるかどうかを確認します。デフォルト値を割り当てるには、null合体を使用します。
string
およびstringValue
については、SwiftJSONのドキュメントをご覧ください