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