web-dev-qa-db-ja.com

SwiftyJSON辞書にキーがあるかどうかを調べるベストプラクティス

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")
}
23
tomatentobi

SwiftyJSONの latest バージョンには、exists()関数があります。

[〜#〜] note [〜#〜]:最新のドキュメントにはコードがあまり反映されていません...実際のメソッドはexists()

// Returns boolean

json["name"].exists()
27
ciauri

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
9
rintaro

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?)を返します。

6
Eneko Alonso

タイプ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")
}

素敵でコンパクト!

1
Ash

私が知る限り、これは機能します:

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のドキュメントをご覧ください

0
Mazyod