Swift: CoreData и общий NSOrderedSet

Я не уверен, что я просто не нашел никакой информации или если это невозможно.

Я просмотрел несколько страниц. Я хочу использовать родовую общую версию NSOrderedSet в Swift.

С помощью Set вы можете сделать это:

Тип Swifts Set привязан к классу Foundations 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. Я мог бы использовать NSOrderedSet из Objective-C, но тогда у меня не будет генериков в Swift.

Есть ли возможность определить порядок в наборе в Swift?

Ответ 1

Нет, нет упорядоченного набора в Свифт и, честно говоря, вы не должны использовать упорядоченный период. Они очень редко используются.

Но несколько раз, это полезно. Поэтому вам не нужно сортировать свои данные самостоятельно. Особенно, если у вас есть сущность со списком сущностей, они не будут отсортированы, потому что это набор. И тогда вам придется создать массив, чтобы данные были подготовлены в определенном порядке, потому что простой набор не сохраняет свой порядок. Поэтому для основных данных это особенно полезно при использовании NSFetchedResultsController.

Это ленивое дополнение к Core Data, которое никогда не должно было случиться. Это никогда не бывает более полезным или более эффективным, чем написание собственной процедуры сортировки. Написание метода удобства в подклассах для создания упорядоченного массива будет более быстрым и более эффективным, чем использование NSOrderedSet.

Когда вы используете NSFetchedResultsController это абсолютно бесполезно, поскольку NSFetchedResultsController заказывает все для вас.

Ответ 2

Я согласен с ответом Маркуса Зарры, это, как правило, не функция, которую стоит использовать, но хотелось добавить пару вещей. Обычно я рекомендую добавлять свойство для явных значений порядка, которые вы можете сортировать.

Упорядоченные наборы являются гражданами второго сорта в Core Data даже для Apple, они не поддерживались в хранилищах iCloud Core Data (хотя в этой системе были проблемы с этой системой, и я считаю, что она теперь устарела вообще).

В Swift можно было бы написать свой собственный упорядоченный набор с семантикой значений, но на данный момент невозможно включить переключение между заданным и установленным набором Foundation.

Если вы действительно отчаянно нуждались в поддержке, вы можете написать собственный генератор кода для создания аксессуаров для вашего пользовательского упорядоченного типа набора (или просто добавить аксессоров вручную).

В заключение есть способы, которыми вы могли бы это сделать, но это не значит, что вы должны.