web-dev-qa-db-fra.com

Convertir NSArray en Swift Array <T>

Dans CoreData, j'ai défini une relation ordonnée à plusieurs. Cette relation est définie dans Swift comme ceci:

@NSManaged var types : NSMutableArray

Cependant, pour utiliser Swift au mieux, je veux utiliser un tableau normal Swift comme Type[]. Cependant, CoreData me force à utiliser NS(Mutable)Array. Comment puis-je taper/convertir le NSArray en Array<Type>[]?

Apparemment, la confusion provient de l'erreur suivante:

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

Bien que cela soit accepté par l'éditeur:

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

J'utilise actuellement obj.types.allObjects as Type[], mais cela ressemble à un hack/contournement.

Révisez ensuite vos sentiments. Ce que vous faites est exactement comment vous faites "transtypez/convertissez le NSArray en Array<Type>[]. "

Un NSArray arrive toujours dans Swift comme contenant AnyObject (c'est-à-dire un Array<AnyObject>, alias AnyObject[]). Si vous savez qu'il ne contient qu'un seul type, c'est à vous de décider, et comment vous le faites, c'est exactement ce que vous êtes censé faire.

MODIFIER Dans Swift 2.0 et les nouvelles API iOS 9, un NSArray arrivera souvent correctement tapé, et aucun cast ne sera nécessaire.

EDIT 2 Dans Swift 3.0, un NSArray qui n'est pas correctement tapé, bien que rare, arrivera comme contenant Any au lieu de AnyObject et devra encore être converti en un type spécifique.

14
matt

Ce qui suit est un morceau de code de travail d'un de mes projets qui pourrait aider?

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

Cela fonctionne, même si je ne suis pas sûr qu'il serait considéré comme optimal.

2
Joseph Beuys' Mum

Énumérez-les de cette façon:

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

Ou utilisez simplement la propriété array de la NSOrderedSet que vous utilisez, comme ceci:

types.array
1
Vaseltior

Vous allez devoir créer un nouveau tableau générique et le remplir manuellement comme suit:

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