Qu’est-ce qu’une tranche dans Swift?

Qu’est-ce qu’une tranche dans Swift et en quoi diffère-t-elle d’un tableau?

Dans la documentation, le type de signature de l’indice (Range) est le suivant:

subscript(Range) -> Slice 

Pourquoi ne pas renvoyer un autre Array plutôt qu’une Slice ?

Il semble que je puisse concaténer une tranche avec un tableau:

 var list = ["hello", "world"] var slice: Array = [] + list[0..list.count] 

Mais cela donne l’erreur:

Impossible de trouver une surcharge pour ‘subscript’ qui accepte les arguments fournis

 var list = ["hello", "world"] var slice: Array = list[0..list.count] 

Qu’est-ce qu’une tranche?

La tranche pointe dans le tableau. Il est inutile de créer un autre tableau lorsque le tableau existe déjà et que la tranche ne peut que décrire la partie souhaitée.

L’addition provoque la coercition implicite, donc ça marche. Pour que votre mission fonctionne, vous devez faire preuve de force:

 var list = ["hello", "world"] var slice: Array = Array(list[0.. 

Remarque: Cette réponse est heureusement invalide à partir de Swift beta 3, car les tableaux sont désormais de véritables types de valeurs.


@matt est correct, ci-dessus – la Slice pointe dans le tableau. Cela semble contraire à la façon dont Swift traite tous les autres types de données avec lesquels nous travaillons, car cela signifie que la valeur de la tranche peut changer même si elle est déclarée comme constante:

 var arr = ["hello", "world", "goodbye"] // ["hello", "world", "goodbye"] let slice = arr[0..2] // ["hello", "world"] arr[0] = "bonjour" println(slice) // ["bonjour", "world"] 

Le pire est que la tranche agit comme un tableau. Étant donné que dans Swift nous attendons une immuabilité, il semble dangereux que les valeurs en indice de la tranche puissent changer sans avertissement:

 println(slice[1]) // "world" arr[1] = "le monde" println(slice[1]) // "le monde" 

Mais si le tableau sous-jacent change trop radicalement, ils se décrochent:

 arr.removeAtIndex(0) // this detaches slice from arr println(slice) // ["bonjour", "le monde"] arr[0] = "hola" println(slice) // ["bonjour", "le monde"] 

Résumé:

Les réponses ci-dessus ont été vraies jusqu’à la version bêta 3 (et peuvent changer à nouveau dans les prochaines versions)

Slice agit maintenant comme un tableau, mais comme @matt dit ci-dessus, il est effectivement une copie superficielle d’un tableau sous le capot, jusqu’à ce qu’une modification soit apscope. Les tranches (maintenant) voient un instantané des valeurs d’origine,

Notez également que la syntaxe slice a changé:

 [from..upToButNotIncluding] -> [from.. 

Exemple:

 var arr = ["hello", "world", "goodbye"] // ["hello", "world", "goodbye"] var arrCopy = arr let slice = arr[0..<2] // ["hello", "world"] arr[0] = "bonjour" arr // ["bonjour", "world", "goodbye"] arrCopy // ["hello", "world", "goodbye"] slice // ["hello", "world"] 

Cela permet un traitement beaucoup plus uniforme, car il est plus simple (IMHO) de traiter les listes de styles python, en filtrant une liste pour en créer une autre. selon la réponse de Matt avant la version bêta 3, vous deviez créer un tableau temporaire pour mapper une tranche. Le nouveau code est maintenant plus simple:

 class NameNumber { var name:Ssortingng = "" var number:Int = 0 init (name:Ssortingng, number:Int) { self.name = name self.number = number } } var number = 1 let names = ["Alan", "Bob", "Cory", "David"] let foo = names[0..<2].map { n in NameNumber(name:n, number:number++) } foo // [{name "Alan" number 1}, {name "Bob" number 2}] 

(bien que pour être juste, foo est toujours une part)

Référence:

http://adcdownload.apple.com//Developer_Tools/xcode_6_beta_3_lpw27r/xcode_6_beta_3_release_notes__.pdf

Changements importants, problèmes résolus, - Langage rapide, paragraphe 1

"Array in Swift a été complètement repensé pour avoir une sémantique complète comme Dictionary et Ssortingng ... m"