web-dev-qa-db-fra.com

Convertir NSSet en Swift Array

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>[]?

45
Bouke

À 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)
47
FranMowinckel
var set = NSSet() //NSSet
var arr = set.allObjects //Swift Array
var nsarr = set.allObjects as NSArray  //NSArray
75
Connor

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.

8
Bouke

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 }

3
Daniel

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()
3
David.Chu.ca

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.

2
mcfroob