unwrapping constructors swift operator-overloading subscript-operator

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/