Dans CoreData, j'ai défini une relation non ordonnée à-plusieurs. Cette relation est définie dans Swift comme ceci:
@NSManaged var types : NSMutableSet
Cependant, pour utiliser Swift au mieux, je veux utiliser un tableau normal Swift comme Type[]
. Cependant, CoreData me force à utiliser NS(Mutable)Set
. Comment puis-je taper/convertir le NSSet
en Array<Type>[]
?
À partir de Xcode 7.2 avec Swift 2.1.1
En fait, j'ai découvert par procès que:
@NSManaged var types : Set<Type>
Fonctionne parfaitement bien.
Le fait est que CoreData génère quelque chose comme:
@NSManaged var types : NSSet
lors de la création d'une sous-classe NSManagedObject
à partir de l'éditeur. Je me demandais donc s'il y avait une méthode peu verbeuse pour utiliser la méthode filter
sans transtyper. Mais alors Swift est censé faire le pont automatiquement entre NSSet, NSArray et leurs homologues. J'ai donc essayé de le déclarer directement en tant qu'ensemble et cela fonctionne.
Répondre à la question, la convertir en tableau devient trivial:
Array(types)
var set = NSSet() //NSSet
var arr = set.allObjects //Swift Array
var nsarr = set.allObjects as NSArray //NSArray
Cette réponse est obsolète à partir de Xcode 7.2/Swift 2.1. Voir la réponse acceptée pour une réponse mise à jour.
J'utilise actuellement obj.types.allObjects as Type[]
, mais cela ressemble à un hack/contournement.
Voici comment je l'ai fait:
` let array = object.NSSet?.allObjects as! [ArrayType] `
Ensuite, vous pouvez manipuler le tableau comme d'habitude:
for item in array { id = item.id }
Utilisez la carte pour obtenir un tableau comme celui-ci:
extension NSSet {
func toArray<T>() -> [T] {
let array = self.map({ $0 as! T})
return array
}
}
...
let myArray: [MyType] = set.toArray()
Vous pouvez également utiliser .sortedArray pour trier les éléments.
Swift 3:
yourNSSetType?.sortedArray(using: [NSSortDescriptor(key: "keyToSortBy", ascending: true, selector: #selector(NSNumber.compare(_:)))]) as! [yourNSSetType]
Pour les chaînes, utilisez NSString.compare dans l'appel #selector.