2016-12-05 13 views
3
var arr:Array<Dictionary<String, String>> = [["title":"Mrs","name":"Abc"],["title":"Mr","name":"XYZ"]] 
arr.sort { (<#[String : String]#>, <#[String : String]#>) -> Bool in 
     <#code#> 
    } 

私は上記のデータ形式の辞書の配列を持っています。この配列をという名前でというキーで並べ替える必要があります。私は古いスイフトでそれをやった:スウィフトで並べ替え3.0

arr.sort{$0.name < $1.name} 

これはもう働かない。この構造を前に進んで並べ替える方法を教えてください。

ありがとうございました。

var arr:Array<Dictionary<String, String>> = [["title":"Mr","name":"XYZ"], ["title":"Mrs","name":"Abc"]] 

print(arr) // [["name": "XYZ", "title": "Mr"], ["name": "Abc", "title": "Mrs"]] 

arr.sort { 
    ($0["name"])! < ($1["name"])! 
} 

print(arr) // [["name": "Abc", "title": "Mrs"], ["name": "XYZ", "title": "Mr"]] 

はそれが助けたホープ:

+4

は、私が「@MartinRが来ている!!」について考えているだけですか? :) –

+2

*古いswift *でもドット表記は機能しません。 – vadian

+0

私はそれが動作することができますが、同意することはできません。私は名前の値を捕まえるためにletを使用しますが、もしあなたが何か短い 'arr.sorted {$ 0 [" name "]! <$ 1 ["name"]! } ' – Dam

答えて

5

はフォーム[String: String] の辞書の配列を持っていると辞書がname性質を持っていません。

サブスクリプトを使用して辞書値を取得すると、 となります。 $0["name"]は、(オプション)を返します。 Swift 2では、選択肢を直接比較することができました。nilは で、それ以外は「nil」より「少ない」とみなされました。したがってスウィフト2 であなたはしかし、オプションの比較演算子が SE-0121 – Remove Optional Comparison Operatorsの実装でスウィフト3 に削除されてい

arr.sortInPlace { $0["name"] < $1["name"] } 

で配列をソートすることができます。

したがって、$0["name"]をアンラップする必要があります。 あなたは、アレイ内のすべての辞書には「名前」キー を持っていることを100%確信している場合それは、例えば、デフォルトの名前を提供し、その後は保証されていないなら、あなたは強制的に

Ahmad F suggestedとして
arr.sort { $0["name"]! < $1["name"]! } 

のラップを解除することができます

arr.sort { ($0["name"] ?? "") < ($1["name"] ?? "") } 

例:

var arr = [["title":"Mrs","name":"Abc"], ["title":"Mr","name":"XYZ"], ["title": "Dr"]] 
arr.sort { ($0["name"] ?? "") < ($1["name"] ?? "") } 
print(arr) 
// [["title": "Dr"], ["name": "Abc", "title": "Mrs"], ["name": "XYZ", "title": "Mr"]] 

1が見ることができるように、「名前」キーが最初に注文されることなく、辞書はnil-合体演算子??を経由して、空の文字列。名前なしでエントリをソートする 簡単な方法最後は次のようになります。

arr.sort { ($0["name"] ?? "\u{10FFFF}") < ($1["name"] ?? "\u{10FFFF}") } 
+0

説明していただきありがとうございます。キーが "名前"であることが保証されていない場合、["タイトル": "Dr"](または "名前"キーのないすべての辞書)を最後に注文する方法はありますか? @AhmadF。 –

+1

。更新を参照してください。 –

+1

@dfri:そうでしょうか?ソートが安定していません。 –

4

実は、私はarr.sort{$0.name < $1.name}は「古いSWIFT」で働いていた場合はかなりわからない、しかし、それは次のようにする必要があります。 (任意のスウィフトのバージョンで)ので $0.nameが無効である、

+1

すべての辞書に' name'フィールドがあると仮定します... –

+0

これはより早期に行われました。迅速に動作しません3.期待される構文を見てください。 –

+0

@MadhupSinghYadav私はこれをプレイグラウンドで実装しました.Xcode 8.1 ... –

関連する問題