constructors - object swift 4
Operador Swift `subĂndice` (4)
Parece que estás buscando subíndices. Puede crear subíndices para su propio tipo como el siguiente ejemplo:
class Container {
var list = [["Hello", "World"], ["Foo", "Bar"]]
subscript(index: Int) -> [String] {
get {
return list[index]
}
set {
list.insert(newValue, atIndex: index)
}
}
}
El ejemplo anterior funciona con el doble [ ]
solo porque sé que vamos a devolver un Array
. Aquí, la Array
contiene cadenas como ejemplo, pero por supuesto podría intercambiarlas en su propio tipo.
var container = Container()
container[0][0] = "Stack"
container[0][1] = "Overflow"
print(container[0][0]) // "Stack"
print(container[1][1]) // "Bar"
Soy principiante con el Swift
y no tengo conocimientos avanzados con los operadores.
Tengo la siguiente clase
class Container {
var list: [Any] = [];
}
Quiero implementar el subscript []
del operador subscript []
para acceder a los datos de la list
.
Necesito algo como esto:
var data: Container = Container()
var value = data[5]
// also
data[5] = 5
También quiero poder escribir algo como esto:
data[1][2]
¿Es posible considerando que el elemento 1
de Container
es una array
?
Gracias por la ayuda.
Parece que hay 2 preguntas aquí.
1. ¿Cómo puedo habilitar los subscripting
en mi propia clase personalizada?
Para habilitar los subscripting
en el Container
su clase, necesita implementar la propiedad computada del subscript
esta manera.
class Container {
private var list : [Any] = [] // I made this private
subscript(index:Int) -> Any {
get {
return list[index]
}
set(newElm) {
list.insert(newElm, atIndex: index)
}
}
}
Ahora puedes usarlo de esta manera.
var container = Container()
container[0] = "Star Trek"
container[1] = "Star Trek TNG"
container[2] = "Star Trek DS9"
container[3] = "Star Trek VOY"
container[1] // "Star Trek TNG"
2. ¿Puedo acceder a un elemento de Container
que admite la creación de subíndices escribiendo algo parecido a data[1][2]
?
Si usamos tu ejemplo no, no puedes. Porque los data[1]
devuelven algo de tipo Any
. Y no se puede subscribir a ninguno.
Pero si añades un molde, se hace posible.
var container = Container()
container[0] = ["Enterprise", "Defiant", "Voyager"]
(container[0] as! [String])[2] // > "Voyager"
Una solución es aprovechar múltiples parámetros en el subscript
Entonces, en lugar de data[1][2]
, puede decir data[1, 2]
. Esto será útil en algunos casos.
struct Container {
subscript(a: Int, b: Int) -> String {
print(a)
print(b)
return "possible"
}
}
let data = Container()
data[1, 2]
class Container
{
var list: [AnyObject] = ["hello" , "world"];
subscript ( i : Int) -> AnyObject{
get{
return list[i]
}
set{
list[i] = newValue
}
}
}
var c : Container = Container()
println(c[1])
c[1] = "lol"
println(c[1])
Para obtener más información sobre el operador: http://nshipster.com/swift-operators/