Swift运算符`下标`[]

Col*_*ral 19 operator-overloading subscript-operator swift

我是初学者,对Swift操作员没有先进的知识.

我有以下课程

class Container {
   var list: [Any] = [];
}
Run Code Online (Sandbox Code Playgroud)

我想实现运算符subscript []以便从中访问数据list.

我需要这样的东西:

var data: Container = Container()
var value = data[5]
// also    
data[5] = 5
Run Code Online (Sandbox Code Playgroud)

我也希望能够写出这样的东西:

data[1][2]
Run Code Online (Sandbox Code Playgroud)

是否可以考虑1来自的元素Containerarray

Thanx寻求帮助.

Luc*_*tti 33

看起来这里有2个问题.

1.如何subscripting在我自己的自定义类上启用?

subscripting在您的类上启用,您Container需要实现这样的subscript计算属性.

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以这样使用它.

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"
Run Code Online (Sandbox Code Playgroud)

2.我可以访问Container支持下标的一个元素data[1][2]吗?

如果我们使用你的例子,你就不能.因为data[1]返回类型的东西Any.你不能下标Any.

但是如果你添加一个演员阵容就有可能

var container = Container()
container[0] = ["Enterprise", "Defiant", "Voyager"]
(container[0] as! [String])[2] // > "Voyager"
Run Code Online (Sandbox Code Playgroud)


onm*_*133 5

解决方法是利用多个参数 subscript

所以data[1][2],你可以说,而不是data[1, 2].这在某些情况下会很方便

struct Container {
  subscript(a: Int, b: Int) -> String {
    print(a)
    print(b)
    return "possible"
  }
}

let data = Container()
data[1, 2]
Run Code Online (Sandbox Code Playgroud)