美文网首页
【Swift 3.1】12 - 下标 (Subscripts)

【Swift 3.1】12 - 下标 (Subscripts)

作者: Lebron_James | 来源:发表于2017-01-25 08:54 被阅读298次

    下标 (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)
    

    可以使用下图表示:

    matrix

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

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

    矩阵的值变为:

    matrix

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


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

    相关文章

      网友评论

          本文标题:【Swift 3.1】12 - 下标 (Subscripts)

          本文链接:https://www.haomeiwen.com/subject/wmetittx.html