指南:下标(Subscripts)

  • 下标 (subscripts)可以定义在类(class)、结构体(structure)和枚举(enumeration)中,是访问集合(collection),列表(list)或序列(sequence)中元素的快捷方式。

  • 可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。

  • 一个类型可以定义多个下标,通过不同索引类型进行重载。下标不限于一维,可以定义具有多个入参的下标满足自定义类型的需求。

下标语法(Subscript Syntax)

  • 定义下标使用subscript关键字,指定一个或多个输入参数和返回类型。

  • 下标可以设定为读写或只读。这种行为由 getter 和 setter 实现,有点类似计算型属性。

  • 如果不指定参数,setter 会提供一个名为newValue的默认参数。

  • 如同只读计算型属性,可以省略只读下标的get关键字。

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

下标用法(Subscript Usage)

  • 下标的确切含义取决于使用场景。下标通常作为访问集(collection),列表(list)或序列(sequence)中元素的快捷方式。可以针对特定的类或结构体的功能来自由地以最恰当的方式实现下标。

  • Swift 的Dictionary类型的下标接受并返回可选类型的值。Dictionary类型之所以如此实现下标,是因为不是每个键都有个对应的值,同时这也提供了一种通过键删除对应值的方式,只需将键对应的值赋值为nil即可。

下标选项(Subscript Options)

  • 下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。下标可以使用变量参数和可变参数,但不能使用输入输出参数,也不能给参数设置默认值。

  • 一个类或结构体可以根据自身需要提供多个下标实现,使用下标时将通过入参的数量和类型进行区分,自动匹配合适的下标,这就是下标的重载

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

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

matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,869评论 1 10
  • 基础部分(The Basics) 当推断浮点数的类型时,Swift 总是会选择Double而不是Float。 结合...
    gamper阅读 1,326评论 0 7
  • 常量与变量使用let来声明常量,使用var来声明变量。声明的同时赋值的话,编译器会自动推断类型。值永远不会被隐式转...
    莫_名阅读 461评论 0 1
  • 白天和J在客户公司进行了一整天的业务访谈,时间排得很满,我们的神经一直紧绷着。傍晚走出客户公司大门,J长吁一口...
    时光酿的蜜阅读 391评论 0 1
  • 现以分组密码算法(DES和SM4)、公钥密码算法(RSA和SM2)、摘要算法(SM3)为例,谈谈国际算法和国密算法...
    小甜妮子__阅读 4,672评论 0 3