web-dev-qa-db-ja.com

Swiftブール値に基づいてオブジェクトの配列をソート

ブール値に基づいてSwift配列をソートする方法を探しています。

NSArrayへのキャストを使用して動作しています:

var boolSort = NSSortDescriptor(key: "selected", ascending: false)
var array = NSArray(array: results)
return array.sortedArrayUsingDescriptors([boolSort]) as! [VDLProfile]

しかし、私はSwiftバリアント、何かアイデアを探していますか?

更新 Arkkuのおかげで、次のコードを使用してこれを修正できました。

return results.sorted({ (leftProfile, rightProfile) -> Bool in
    return leftProfile.selected == true && rightProfile.selected != true
})
40
Antoine

Swiftの配列は、sortを使用して、またはsortedを使用して新しい配列にソートできます。いずれかの関数の単一パラメーターは、2つの要素を取り、最初の要素が2番目の要素の前に順序付けられている場合にtrueを返すクロージャーです。クロージャーのパラメーターを使用する最短の方法は、それらを$0および$1として参照することです。

例(最初に真のブール値をソートする):

// In-place:
array.sort { $0.selected && !$1.selected }

// To a new array:
array.sorted { $0.selected && !$1.selected }

(編集:Swift 3および4、以前はsortsortInPlaceで、sortedsortでした。)

84
Arkku

New(for Swift 1.2)

return results.sort { $0.selected && !$1.selected }

Old(for Swift 1.0)

resultsのタイプは[VDLProfile]およびVDLProfileにはBoolメンバーselectedがあります。

return results.sorted { $0.selected < $1.selected }

sorted のドキュメントを参照してください

2
Teemu Kurppa

Swiftの標準ライブラリには、ユーザーが提供する並べ替えクロージャーの出力に基づいて、既知の型の値の配列を並べ替えるsortという関数があります。

reversed = sorted(array) { $0 > $1 }

reversedは、クロージャーで指定された条件に従ってソートされる新しい配列になります。

1
sasquatch