14

情報が見つからなかっただけなのか、それとも不可能なのかはわかりません。

いくつかのページを調べました。Swift で NSOrderedSet の汎用バージョンを使用したいと考えています。

Set を使用すると、次のことができます。

Swift の Set 型は、Foundation の NSSet クラスにブリッジされています。ソース: Apple Docs - セット

NSManagedObject サブクラスでは、NSSet を Set に変更するだけで機能します。(テストしました)

@property NSArray<NSDate *> *dates;
@property NSSet<NSString *> *words;
@property NSDictionary<NSURL *, NSData *> *cachedData;

var dates: [NSDate]
var words: Set<String>
var cachedData: [NSURL: NSData]

出典: Apple Docs - 軽量ジェネリック

しかし、Swift で順序付きセットへの参照が見つかりませんでした。Objective-C の NSOrderedSet を使用できますが、その場合、Swift にはジェネリックがありません。

Swift でセット内の順序を定義する可能性はありますか?

4

2 に答える 2

9

いいえ、Swift には順序付きセットはありません。正直なところ、順序付きセット期間を使用するべきではありません。それらはめったに使用されません。

しかし、場合によっては便利です。したがって、自分でデータを並べ替える必要はありません。特に、サブエンティティのリストを持つエンティティがある場合、それらはセットであるためソートされません。そして、単純なセットはその順序を保持しないため、データを特定の順序で準備するために配列を作成する必要があります。そのため、コア データの場合、NSFetchedResultsController と一緒に使用すると特に便利です。

これはコア データへの怠惰な追加であり、決して起こらないはずです。独自のソート ルーチンを作成することよりも便利でパフォーマンスが高いことはありません。サブクラスにコンビニエンス メソッドを記述して順序付けられた配列を生成すると、NSOrderedSet.

を使用しているときは、すべてが注文されるNSFetchedResultsControllerため、まったく役に立ちません。NSFetchedResultsController

于 2016-04-25T15:45:18.833 に答える
0

Marcus Zarra の回答に同意します。これは通常、使用する価値のある機能ではありませんが、いくつか追加したい機能です。一般的には、ソートできる明示的な順序値のプロパティを追加することをお勧めします。

Ordered Sets は、Apple にとっても Core Data の第 2 級市民であり、iCloud Core Data ストアではサポートされていませんでした (ただし、そのシステムには一般的に問題があり、現在は一般的に非推奨になっていると思います)。

Swift 用語では、値のセマンティクスを使用して独自の順序付きセットを作成することは可能ですが、現時点では Foundation 順序付きセットとの間のブリッジを有効にすることはできません。

本当にそれをサポートしたい場合は、カスタム コード ジェネレーターを記述して、カスタムの順序付きセット タイプのアクセサーを作成できます (または、アクセサーを手動で追加するだけです)。

結論として、それを行う方法はありますが、そうすべきという意味ではありません。

于 2016-07-12T23:34:10.187 に答える