web-dev-qa-db-ja.com

SwiftのNSDictionaryとDictionaryの違いは何ですか?

私はSwiftを学習しています。その中にDictionaryが表示されます。
しかし、SwiftでNSDictionaryを使用している例はたくさんあります。
これら2つの違いは何ですか?
Swiftでインデックスのある配列をPHPの配列のように使用したい。
どちらを使用するのが良いですか?

23
TomSawyer

辞書はネイティブSwift構造体です。NSDictionaryはCocoaクラスです。ドキュメントは非常に明確かつ完全に説明されているため、相互に(通常の制限内で)ブリッジされています。

これは、ArrayおよびNSArrayとまったく同じです。

18
matt

実際には、Swiftの強力な型の概念に関して、大きな違いは

  • NSDictionaryは通常、タイプが指定されていません
  • Dictionaryには特定のタイプがあるはずです。

したがって、ネイティブDictionaryが推奨されます。

5
vadian

これが契約です

すべての意図と目的のために、それらは同じものです。 Foundationをインポートする限り、コンパイラはそれらを同じものとして認識します。

特定の違いについては、 したがってApple doc が役立ちます。

概観

NSObjectは、ほとんどのObjective-Cクラス階層のルートクラスです。 NSObjectを通じて、オブジェクトはランタイムシステムへの基本的なインターフェイスとObjective-Cオブジェクトとして動作する機能を継承します。

つまり、NSObjectsは古い(Objective C)時代の古代の遺物であるということです。

何が良いかについては、それはあなた次第です。 Swiftオブジェクトは、コードを最新の状態に保つためだけにnsの対応物よりも優れていますが、nsを必要とするNSURLCONNECTIONのようなコードを使用している場合は、nsオブジェクトを使用する必要があるかもしれませんオブジェクト。

お役に立てれば。

2
rocket101

この例を考えてみましょう

    let dataArray = NSMutableArray()

    let d0 = ["code":"AA","name":"American Airlines"]
    let d1 = ["code":"BA","name":"British Airlines"]
    let d2 = ["code":"DA","name":"Delta Airlines"]

    dataArray.addObject(d0)
    dataArray.addObject(d1)
    dataArray.addObject(d2)

後で...

let d0 = dataArray.objectAtIndex(0) as! [String:String]
let lbl = UILabel() 
lbl.text = d0["code"] // no xcode warnings

SwiftでのNSDictionaryの使用

let d0 = dataArray.objectAtIndex(0) as! NSDictionary 

次に、辞書の値を強制的に整形する必要があります。

lbl1.text = d0["name"] as! String

経験から-json応答を処理するとき-緩やかに型付けされているためNSDictionaryを使用しましたが、それが正確に何を含んでいるかを保証することはできません-それだけが有効なjsonです。ネイティブSwiftこのユースケースを処理するためのツールのライブラリが増えています。ここをご覧になることをお勧めします https://github.com/search?q=json+NSDictionary+Swift&type=Code&utf8 =%E2%9C%9

この場合、「if let」ダンスでデータをハッキングする必要があります。

if let results = json["result"] as? NSDictionary

最後に、NSMutableDictionaryは、NSDictionaryでキーと値のペアを変更できないため、Dictionaryと同等です。

例えば。

results["code"] = 100 // <-- BOOM

回避策-

let mResults = NSMutableDictionary(dictionary:results)

mResults["code"] = NSNumber(100) // <-- OK

明確化を要求するもの-NSMutableDictionaries内にのみNSObjects(NSNumbers/NSArrays/NSCount/NSSet)を固定できます。 Swift辞書はこれを回避します。

1
johndpope