bouke bouke - 1 month ago 10
Swift Question

Convert NSArray to Swift Array<T>

In CoreData I have defined an ordered to-many relationship. This relationship is defined in Swift like this:

@NSManaged var types : NSMutableArray


However, to use Swift at it's best, I want to use a normal Swift array like
Type[]
. However, CoreData forces me to use
NS(Mutable)Array
. How can I type-cast / convert the
NSArray
to
Array<Type>[]
?

Apparently the confusion arises from the following error:

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


While this is accepted by the editor:

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

Answer

I'm currently using obj.types.allObjects as Type[], but that feels like a hack/workaround.

Then revise your feelings. What you're doing is exactly how you do "type-cast / convert the NSArray to Array<Type>[]."

An NSArray always arrives into Swift as containing AnyObject (i.e. an Array<AnyObject>, aka AnyObject[]). Casting it down to a specific type, if you know that it contains all one type, is up to you, and how you are doing it is exactly what you are supposed to do.

EDIT In Swift 2.0 and the new iOS 9 APIs, an NSArray will often arrive correctly typed, and no cast will be needed.