Преобразование NSArray в Swift Array <T>

В CoreData я определил упорядоченное отношение to-many. Это соотношение определено в Swift следующим образом:

@NSManaged var types : NSMutableArray

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

По-видимому, путаница возникает из-за ошибки:

let array = obj.types as T[] // Cannot convert expression type 'Node[]' to type '$T2'

Пока это принято редактором:

let array = obj.types as AnyObject[] as T[] // No complaint

Ответ 1

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

Затем пересмотреть свои чувства. То, что вы делаете, - это именно то, как вы делаете "type-cast/convert NSArray to Array<Type>[]."

NSArray всегда входит в Swift как содержащий AnyObject (т.е. a Array<AnyObject>, aka AnyObject[]). Отбрасывая его на определенный тип, если вы знаете, что он содержит все один тип, зависит от вас, и как вы это делаете, именно то, что вы должны делать.

EDIT В Swift 2.0 и новых API-интерфейсах iOS 9 NSArray часто поступает правильно напечатанным, и никакого приведения не требуется.

РЕДАКТИРОВАТЬ 2 В Swift 3.0 NSArray, который неправильно напечатан, хотя и необычен, будет появляться как Any вместо AnyObject и все равно придется отбросить его до определенного тип.

Ответ 2

Перечислите их следующим образом:

for type in types.array {
    // Do something
}

Или просто используйте свойство array используемого NSOrderedSet, например:

types.array

Ответ 3

Ниже приведен фрагмент кода из одного из моих проектов, который может помочь?

if let rawArray = rawData as? NSArray,
   let castArray = rawArray as? Array< Dictionary< String, AnyObject > >
   { 
       // etc... 
   }

Он работает, хотя я не уверен, что он будет считаться оптимальным.

Ответ 4

Вам нужно будет создать новый общий массив и вручную заполнить его следующим образом:

    var result = Type[]()

    for item : AnyObject in self {
        //  Keep only objC objects compatible with OutType
        if let converted = bridgeFromObjectiveC(item, Type.self) {
            result.append(converted)
        }
    }