Si elimino elementos de una matriz y los almaceno en una variable como esta:
let lastFive = myArray.suffix(5)o esto:
let lastFive = myArray.dropLast(5) lastFive será Array<SomeType>.SubSequence en lugar del tipo de elemento SomeType. ¿Cómo hago que lastFive se convierta en el [Element] en lugar de una SubSequence ?
Me gusta usar esta extensión:
extension Sequence { func asArray() -> [Element] { return Array(self) } } Dicho esto, los protocolos Collection y Sequence definen un método de sequence() .
Sequence.prefix() devuelve [Element] mientras que Collection.prefix() devuelve una SubSequence .
Dado un Array definido de la siguiente manera, podemos hacer algunas cosas interesantes.
let myArray = [1, 2, 3, 4, 5] Lo siguiente funciona porque el compilador sabe usar la versión Sequence de suffix() .
func lastFive() -> [Int] { return myArray.suffix(5) }Aquí solo estoy usando la extensión de arriba.
func lastFive2() -> [Int] { return myArray.suffix(5).asArray() } Lo siguiente también funciona porque el compilador sabe usar la versión Sequence de suffix() .
func lastFive3() -> [Int] { let suffix: [Int] = myArray.suffix(5) return suffix } Esto no se compila porque el compilador asume que desea usar la versión Collection de suffix() .
func doesNotCompile() -> [Int] { let suffix = myArray.suffix(5) return suffix }