Swift 3で辞書の配列を並べ替えるのに時間があります。Swift 3、辞書の配列を並べ替え
var dicArray = [Dictionary<String, String>()]
let dic1 = ["last": "Smith", "first": "Robert"]
dicArray.append(dic1)
let dic2 = ["last": "Adams", "first": "Bill"]
dicArray.append(dic2)
let sortedArray = dicArray.sort { ($0["last"] as? String) < ($1["last"] as? String) }
うまく行っておりませんスウィフト3に同じコードを変換する:
はスウィフト2では、私はそれをうまく働いたこの方法は、だろう。
let sortedArray = dicArray.sorted { ($0["last"]! as String) < ($1["last"]! as String) }
しかし、アプリが常にオプション値をアンラップしながら、それがnilを見つけたというエラーで、クラッシュ:システムは、(遠回りのルートで)これに私を導きました。 ?!
、あまりにも長い間テーブルに対して私の頭を叩いてありとあらゆる組み合わせてSとSを入れた後、私は仕事を得るために、古いアプローチに頼っ:
作品let sortedArray = (dicArray as NSArray).sortedArray(using: [NSSortDescriptor(key: "last", ascending: true)]) as! [[String:AnyObject]]
、およびI私は一緒に動いていますが、それほど甘いのではありませんか?
どこが間違っていましたか?このような場合、純粋なSwiftソート機能を動作させるにはどうすればよいですか?
静的なキーセットを使用している場合は、必ずdictではなくstructを使用してください。 – Alexander
@Alexanderが書いているように、構造体を使用してください:キーが静的ではない場合、上記のソートは非常に脆弱ですw.r.t.辞書の配列内のすべての辞書に実際にキー「last」が含まれていることを確認する必要があります。 'dicArray.contains(where:{!$ 0.keys.contains(" last ")})'が 'true'ではないことをチェックします。このようなガードを最初に組み込んでいた場合は、入力確認に違反しているので、空の追加辞書をキャッチしたでしょう。 – dfri