web-dev-qa-db-fra.com

Swift Défini sur Tableau

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.

158
Fried Rice

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]
316
Martin R

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]
17
Imanou Petit

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

9
user7206023

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
7
CodeBender

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 }
}