【Swift 3.1】12 - 下标 (Subscripts)

下标 (Subscripts)

自从苹果2014年发布Swift,到现在已经两年多了,而Swift也来到了3.1版本。去年利用工作之余,共花了两个多月的时间把官方的Swift编程指南看完。现在整理一下笔记,回顾一下以前的知识。有需要的同学可以去看官方文档>>。


类、结构和枚举都可以定义下标,能让我们快速访问一个集合、列表或序列的成员元素。一个类型可以定义多个下标。

下标语法 (Subscript Syntax)

下标语法类似于实例方法和计算属性语法。使用subscript关键字来定义下标,然后指定一个或多个参数和返回类型,就像实例方法一样。但不同于实例方法,下标可以读写或者只读。

subscript(index: Int) -> Int {
    get {
        // return an appropriate subscript value here
    }
    set {
        // perform a suitable setting action here
    }
}

newValue的类型与下标返回值类型相同,当然我们也可以不用指定参数名,Swift会默认提供一个newValue的参数名供我们使用。

就像只读计算属性一样,我们写只读下标时可以把get去掉:

subscript(index: Int) -> Int {
    return an appropriate subscript value here
}

下面是一个例子:

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimeTable(multiplier: 3)
print("six times three is \(threeTimeTable[6])")

下标的使用 (Subscript Usage)

下标的意义决定于它所在的上下文。下标通常作为一个捷径,用于方法集合、列表或者序列的成员元素。

例如,Swift的Dictionary就是实现下标来设置和获取存储在字典的值。

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

下标选项 (Subscript Options)

下标可以接受任意数量任意类型的参数,也可以返回任意类型的值,还可以使用可变参数,但是不能使用in-out参数和给参数提供默认值。

如果有需要的话,类和结构可以提供多个下标实现。在使用时,他会根据中括号内的值或者值的类型来选择合适的下标。定义多个下标被称为下标重载

通常情况下,下标只带一个参数,但是也可以带多个参数。例如下面的矩阵结构:

struct Matrix {
    let rows: Int, columns: Int
    var grid: [Double]
    
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(repeat: 0.0, count: rows * columns)
    }
    
    func indexIsValid(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    
    subscript(row: Int, column: Int) -> Double {
        get {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

创建一个矩阵:

var matrix = Matrix(rows: 2, columns: 2)

可以使用下图表示:

【Swift 3.1】12 - 下标 (Subscripts)_第1张图片
matrix

使用下标来设置矩阵里面的值:

matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

矩阵的值变为:

【Swift 3.1】12 - 下标 (Subscripts)_第2张图片
matrix

第十二部分完。下个部分:【Swift 3.1】13 - 继承 (Inheritance)


如果有错误的地方,欢迎指正!谢谢!

你可能感兴趣的:(【Swift 3.1】12 - 下标 (Subscripts))