Преобразование NSSet в Swift Array

В CoreData я определил отношение неупорядоченных ко многим. Это соотношение определено в Swift следующим образом:

@NSManaged var types : NSMutableSet

Однако, чтобы использовать Swift лучше всего, я хочу использовать обычный массив Swift, например Type[]. Однако CoreData заставляет меня использовать NS(Mutable)Set. Как я могу напечатать/преобразовать NSSet в Array<Type>[]?

Ответ 1

Как и Xcode 7.2 с Swift 2.1.1

Собственно, я узнал, что:

@NSManaged var types : Set<Type>

Работает отлично.

Дело в том, что CoreData генерирует что-то вроде:

@NSManaged var types : NSSet

при создании подкласса NSManagedObject из редактора. Поэтому мне было интересно, если бы был не очень подробный метод использования метода filter без кастования. Но затем Swift должен автоматически соединяться между NSSet, NSArray и их коллегами. Поэтому я попытался объявить его непосредственно как Set, и он работает.

Отвечая на вопрос, преобразование его в массив становится тривиальным:

Array(types)

Ответ 2

var set = NSSet() //NSSet
var arr = set.allObjects //Swift Array
var nsarr = set.allObjects as NSArray  //NSArray

Ответ 3

Этот ответ устарел от Xcode 7.2/Swift 2.1. См. Принятый ответ для получения обновленного ответа.


В настоящее время я использую obj.types.allObjects as Type[], но это похоже на хак/обходной путь.

Ответ 4

Вы также можете использовать .sortedArray для сортировки элементов.

Swift 3:

yourNSSetType?.sortedArray(using: [NSSortDescriptor(key: "keyToSortBy", ascending: true, selector: #selector(NSNumber.compare(_:)))]) as! [yourNSSetType]

Для строк используйте NSString.compare в вызове #selector.

Ответ 5

Вот как я это сделал:

` let array = object.NSSet?.allObjects as! [ArrayType] `

Затем вы можете манипулировать массивом как обычно:

for item in array { id = item.id }