Un NSSet
peut être converti en Array
en utilisant set.allObjects()
, mais cette méthode n'existe pas dans la nouvelle Set
(introduite avec Swift 1.2). Cela peut toujours être fait en convertissant Swift Set en NSSet et en utilisant la méthode allObjects()
, mais cela n’est pas optimal.
Vous pouvez créer un tableau avec tous les éléments d'un même Swift Set
simplement avec
let array = Array(someSet)
Cela fonctionne parce que Set
est conforme au protocole SequenceType
et qu'un Array
peut être initialisé avec une séquence. Exemple:
let mySet = Set(["a", "b", "a"]) // Set<String>
let myArray = Array(mySet) // Array<String>
print(myArray) // [b, a]
Dans le cas le plus simple , avec Swift 3, vous pouvez utiliser Array
's init(_:)
initializer obtenir une Array
à partir d'un Set
. init(_:)
a la déclaration suivante:
init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element
Crée un tableau contenant les éléments d'une séquence.
Usage:
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = Array(stringSet)
print(stringArray)
// may print ["toy", "car", "bike", "boat"]
Cependant , si vous souhaitez également effectuer des opérations sur chaque élément de votre Set
tout en le transformant en Array
, vous peut utiliser map
, flatMap
, sort
, filter
et d'autres méthodes fonctionnelles fournies par le protocole Collection
:
let stringSet = Set(["car", "boat", "bike", "toy"])
let stringArray = stringSet.sorted()
print(stringArray)
// will print ["bike", "boat", "car", "toy"]
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = stringSet.filter { $0.characters.first != "b" }
print(stringArray)
// may print ["car", "toy"]
let intSet = Set([1, 3, 5, 2])
let stringArray = intSet.flatMap { String($0) }
print(stringArray)
// may print ["5", "2", "3", "1"]
let intSet = Set([1, 3, 5, 2])
// alternative to `let intArray = Array(intSet)`
let intArray = intSet.map { $0 }
print(intArray)
// may print [5, 2, 3, 1]
ADDITION:
Swift n’a pas DEFINED ORDER pour Set et Dictionary.Pour cette raison, vous devez utiliser la méthode triée () pour éviter d’obtenir des résultats inattendus tels que votre tableau peut ressembler à ["a", "b"] ou ["b", "a"] et vous ne le souhaitez pas.
POUR FIXER CELA:
FOR SETS
var example:Set = ["a","b","c"]
let makeExampleArray = [example.sorted()]
makeExampleArray
Résultat: ["a", "b", "c"]
Sans triés ()
Ça peut être:
["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"]
mathématiques simples: 3! = 6
J'ai créé une simple extension qui vous donne un Array
non classé comme propriété de Set
dans Swift 4..
extension Set {
var array: [Element] {
return Array(self)
}
}
Si vous voulez un tableau trié, vous pouvez soit ajouter une propriété calculée supplémentaire, soit modifier la propriété existante en fonction de vos besoins.
Pour l'utiliser, il suffit d'appeler
let array = set.array
La réponse actuelle pour Swift 2.x et versions ultérieures (du Swift guide du langage de programmation sur les types de collection) semble être une itération sur les entrées de l'ensemble, comme suit:
for item in myItemSet {
...
}
Ou, pour utiliser la méthode "trié":
let itemsArray = myItemSet.sorted()
Il semble que les concepteurs Swift n'appréciaient pas allObjects comme un mécanisme d'accès car les ensembles n'étaient pas vraiment ordonnés. Ils voulaient donc s'assurer que vous ne sortiez pas un tableau sans un ordre explicite appliqué.
Si vous ne voulez pas la surcharge du tri et ne vous souciez pas de l'ordre, j'utilise généralement les méthodes map ou flatMap, qui devraient être un peu plus rapides pour extraire un tableau:
let itemsArray = myItemSet.map { $0 }
Ce qui construira un tableau du type retenu par le jeu. Si vous souhaitez qu'il s'agisse d'un tableau d'un type spécifique (par exemple, donne droit à partir d'un ensemble de relations d'objet géré qui ne sont pas déclarées comme un ensemble typé), vous pouvez effectuer les opérations suivantes:
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}