Convert NSArray to Swift Array<T>

筅森魡賤 提交于 2019-12-18 11:44:14

问题


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

回答1:


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.

EDIT 2 In Swift 3.0, an NSArray that is not correctly typed, though uncommon, will arrive as containing Any instead of AnyObject and will still have to be cast down to a specific type.




回答2:


The following is a working piece of code from one of my projects that might help?

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

It works, although I'm not sure it would be considered optimal.




回答3:


Enumerate them that way :

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

Or use simply the array property of the NSOrderedSet you are using, like so :

types.array



回答4:


You are going to have to create a new generic array and manually populate it as follows:

    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)
        }
    }


来源:https://stackoverflow.com/questions/24422840/convert-nsarray-to-swift-arrayt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!