taylor - ¿Qué es una porción en Swift?
taylor swift wikipedia (3)
¿Qué es una porción en Swift y cómo difiere de una matriz?
De la documentación, la firma de tipo del subíndice (Rango) es:
subscript(Range<Int>) -> Slice<T>
¿Por qué no devuelve otro Array<T>
lugar de un Slice<T>
?
Parece que puedo concatenar una porción con una matriz:
var list = ["hello", "world"]
var slice: Array<String> = [] + list[0..list.count]
Pero esto produce el error:
no pudo encontrar una sobrecarga para ''subíndice'' que acepta los argumentos proporcionados
var list = ["hello", "world"]
var slice: Array<String> = list[0..list.count]
¿Qué es una porción?
Resumen:
Las respuestas anteriores fueron verdaderas hasta Beta 3 (y pueden cambiar de nuevo en versiones futuras)
Slice ahora actúa como una matriz, pero como @matt dijo anteriormente, es efectivamente una copia superficial de una matriz debajo del capó, hasta que se realice un cambio. Las rebanadas (ahora) ven una instantánea de los valores originales,
También tenga en cuenta que la sintaxis del sector ha cambiado:
[from..upToButNotIncluding] -> [from..<upToButNotIncluding]
Ejemplo:
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"]
Esto permite un procesamiento mucho más uniforme, ya que es más simple (en mi humilde opinión) hacer el procesamiento de la lista de estilo de python: filtrar una lista para crear otra. según la respuesta de Matt antes de Beta 3, tenía que crear una matriz temporal para mapear una porción. El nuevo código ahora es más simple:
class NameNumber {
var name:String = ""
var number:Int = 0
init (name:String, 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}]
(aunque para ser justos, foo sigue siendo una rebanada)
Referencia:
Cambios importantes, problemas resueltos, - Swift Language, párrafo 1
"Array in Swift ha sido completamente rediseñado para tener una semántica de valor completo como Dictionary and String ... m"
Los puntos de corte en la matriz. No tiene sentido hacer otra matriz cuando la matriz ya existe y la porción puede describir la parte deseada de ella.
La adición causa coerción implícita, por lo que funciona. Para hacer que tu tarea funcione, deberías forzar:
var list = ["hello", "world"]
var slice: Array<String> = Array(list[0..<list.count])
Nota: Esta respuesta es felizmente inválida a partir de Swift beta 3, ya que las matrices ahora son tipos de valores verdaderos.
@matt es correcto, arriba: los puntos de Slice<T>
en la matriz. Esto parece contrario a la forma en que Swift maneja todos los otros tipos de datos con los que estamos trabajando, ya que significa que el valor de la división puede cambiar incluso si se declara como una constante:
var arr = ["hello", "world", "goodbye"] // ["hello", "world", "goodbye"]
let slice = arr[0..2] // ["hello", "world"]
arr[0] = "bonjour"
println(slice) // ["bonjour", "world"]
La peor parte es que la porción actúa como una matriz. Dado que en Swift tenemos una expectativa de inmutabilidad, parece peligroso que los valores subscriptos de la porción puedan cambiar sin previo aviso:
println(slice[1]) // "world"
arr[1] = "le monde"
println(slice[1]) // "le monde"
Pero si la matriz subyacente cambia demasiado drásticamente, se desenganchan:
arr.removeAtIndex(0) // this detaches slice from arr
println(slice) // ["bonjour", "le monde"]
arr[0] = "hola"
println(slice) // ["bonjour", "le monde"]