跳转至

下标脚本

下标脚本

下标脚本可以定义在类、结构体和枚举这些目标中。对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,而且索引值的个数可以是多个。下标脚本可以使用变量参数和可变参数,但不能使用使用输入输出参数或者参数设置默认值。

使用subscript关键字来定义下标脚本,下标脚本可以设定为读写或只读。

subscript(index: Int) -> Int {
// 如果是只读属性,可以直接将原本应该写在gt代码块中的代码写在subscript中
    get {
      // 返回与入参匹配的Int类型的值
    }
    // newValue可以省略
    set(newValue) {
      // 执行赋值操作
    }
}

示例

struct TimesTable {
    let multiplier:Int
    // 只读的下标脚本
    subscript(index:Int) -> Int{
        return multiplier * index
    }
}

let threeTimesTable = TimesTable(multiplier: 3)

println("3的6倍是\(threeTimesTable[6])")
//输出 3的6倍是18

还可以对已有的支持下标访问类型进行扩展。

下面我们对数组增加切片功能。

extension Array{
    subscript(input:[Int]) -> ArraySlice<T>{
        get{
            var result = ArraySlice<T>()
            for (index,i)in enumerate(input){
                assert(i<self.count, "Index out of range")
                result.append(self[i])
            }
            return result
        }
        set{
            for(index,i) in enumerate(input){
                assert(i<self.count,"Index out of range")
                self[i] = newValue[index]
            }
        }
    }
}

var arr = [1,2,3,4,5]

println(arr[[2,4]])
// 输出 [3,5]

arr[[1,3]]=[-2,-4]

println(arr)
// 输出[1, -2, 3, -4, 5]

评论