Swift: CoreData и универсальный NSOrderedSet

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам