Aplatir un tableau de tableaux dans Swift

Y a-t-il une contrepartie dans Swift pour flatten Scala, Xtend, Groovy, Ruby et co?

 var aofa = [[1,2,3],[4],[5,6,7,8,9]] aofa.flatten() // shall deliver [1,2,3,4,5,6,7,8,9] 

bien sûr, je pourrais utiliser réduire pour cela mais ça craint un peu

 var flattened = aofa.reduce(Int[]()){ a,i in var b : Int[] = a b.extend(i) return b } 

Swift 3.0

reduce :

 let numbers = [[1,2,3],[4],[5,6,7,8,9]] let reduced = numbers.reduce([], +) 

flatMap :

 let numbers = [[1,2,3],[4],[5,6,7,8,9]] let flattened = numbers.flatMap { $0 } 

joined :

 let numbers = [[1,2,3],[4],[5,6,7,8,9]] let joined = Array(numbers.joined()) 

Depuis Swift 2.0, il existe une méthode flatten (ou joined dans Swift 3) pour le protocole CollectionType :

 let numbers = [[1,2,3],[4],[5,6,7,8,9]] let flattened = Array(numbers.flatten()) 

Dans certains cas, l’utilisation de flatten() peut être bénéfique car elle retourne une collection paresseuse au lieu d’un tableau, mais peut toujours être convertie en tableau lorsqu’elle est transmise à Array() .

Cela a fonctionné pour moi:

 let numbers = [[1, 2, 3], [4, 5, 6]] let flattenNumbers = numbers.reduce([], combine: +) 

Une autre implémentation plus générique de reduce ,

 let numbers = [[1,2,3],[4],[5,6,7,8,9]] let reduced = reduce(numbers,[],+) 

Cela accomplit la même chose mais peut donner plus de détails sur ce qui se passe dans la reduce .

Des documents d’Apple,

 func reduce(sequence: S, initial: U, combine: (U, S.Generator.Element) -> U) -> U 

La description

Renvoyer le résultat de l’appel répété combiner avec une valeur accumulée initialisée à l’ initial et chaque élément de la séquence , à son tour.

Swift 4.x

Juste pour append un peu plus de complexité dans le tableau, s’il existe un tableau qui contient un tableau de tableaux, alors flatMap échouera réellement.

Supposons que le tableau soit

 var array:[Any] = [1,2,[[3,4],[5,6,[7]]],8] 

Qu’est-ce que flatMap ou compactMap renvoie est:

 array.compactMap({$0}) //Output [1, 2, [[3, 4], [5, 6, [7]]], 8] 

Pour résoudre ce problème, nous pouvons utiliser notre simple pour la logique de boucle + récursivité

 func flattenedArray(array:[Any]) -> [Int] { var myArray = [Int]() for element in array { if let element = element as? Int { myArray.append(element) } if let element = element as? [Any] { let result = flattenedArray(array: element) for i in result { myArray.append(i) } } } return myArray } 

Alors appelez cette fonction avec le tableau donné

 flattenedArray(array: array) 

Le résultat est:

 [1, 2, 3, 4, 5, 6, 7, 8] 

Cette fonction aidera à aplatir tout type de tableau, en considérant le cas de Int ici

Sortie du terrain de jeu: entrer la description de l'image ici

 func convert(){ let arr = [[1,2,3],[4],[5,6,7,8,9]] print("Old Arr = ",arr) var newArr = [Int]() for i in arr{ for j in i{ newArr.append(j) } } print("New Arr = ",newArr) } 

entrer la description de l'image ici