zoukankan      html  css  js  c++  java
  • Swift3.0P1 语法指南——下标

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html#//apple_ref/doc/uid/TP40014097-CH16-ID305

    1、下标(Subscript)

    类、结构体和枚举都可以定义下标,这是一种访问集合类型、列表或者队列的成员元素的简写方式。你可以用下标来设置和取出对应的值,而不必单独设置写入和读取的方法。例如,访问Array实例用someArray[index],访问Dictionary实例用someDictionary[key]。

    可以为同一个类型定义多种下标,选择哪一种下标形式则取决于你要传递给下标的索引值的类型。下标的维度不限定为一维,你可以根据自己的需要给下标设置多个输入参数。

    2、下标语法

    下标可以允许你在实例名字后面的[]中写上一个或多个值来对这个实例进行query。下标的语法与实例方法和计算属性的语法类似。和实例方法一样,下标有传入参数和返回类型。不同于实例方法的是,下标可以可读可写或者只读的。和计算属性一样,下标有get和set:

    1 subscript(index: Int) -> Int {
    2     get {
    3         // return an appropriate subscript value here
    4     }
    5     set(newValue) {
    6         // perform a suitable setting action here
    7     }
    8 }

    newValue的类型和subscript的返回类型相同。和计算属性一样,如果你不指定新值的参数名,则默认使用newValue。

    只读下标:

    1 subscript(index: Int) -> Int {
    2     // return an appropriate subscript value here
    3 }

    下面是一个只读下标的例子:

    1 struct TimesTable {
    2     let multiplier: Int
    3     subscript(index: Int) -> Int {
    4         return multiplier * index
    5     }
    6 }
    7 let threeTimesTable = TimesTable(multiplier: 3)
    8 print("six times three is (threeTimesTable[6])")
    9 // prints "six times three is 18"

    3、下标的使用规则

    subscript的实际意义取决于它所处的环境。通常,subscript用于方便访问集合、列表、队列的成员。你可以根据自己的需求来定义subscript的实现。

    例如,Dictionary的下标:

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

    注意:Dictionary的下标返回的是Int?类型,因为并非每一个key都能对应一个value,如果输入的key不存在,则返回nil。

    4、subscript的可选项

    subscript可以接收任意数量的参数,这些参数可以是任何类型。

    subscript也可以返回一种类型的值。

    subscript可以接收变量参数和不定参数,但是不能接收in-out参数,也不能有参数默认值。

    类和结构体可以定义多种subscript的实现,使用哪一种实现则取决于[]中传入的参数类型。多种subscript的实现,也称为subscript重载。

    尽管最常见的是一个参数的subscript,你可以根据需要定义多个参数。

     1 struct Matrix {
     2     let rows: Int, columns: Int
     3     var grid: [Double]
     4     init(rows: Int, columns: Int) {
     5         self.rows = rows
     6         self.columns = columns
     7         grid = Array(count: rows * columns, repeatedValue: 0.0)
     8     }
     9     func indexIsValid(row: Int, column: Int) -> Bool {
    10         return row >= 0 && row < rows && column >= 0 && column < columns
    11     }
    12     subscript(row: Int, column: Int) -> Double {
    13         get {
    14             assert(indexIsValid(row, column: column), "Index out of range")
    15             return grid[(row * columns) + column]
    16         }
    17         set {
    18             assert(indexIsValid(row, column: column), "Index out of range")
    19             grid[(row * columns) + column] = newValue
    20         }
    21     }
    22 }

    上面是 一个矩阵的结构体。

    用下标的方式来访问和修改数组的值。

    在subscript的get和set中都用了断言来检查下标是否有效,其中,用了一个indexIsValid(row:column:)方法:

    1 func indexIsValid(row: Int, column: Int) -> Bool {
    2     return row >= 0 && row < rows && column >= 0 && column < columns
    3 }

    如果下标超出了矩阵的范围,就会产生一个assertion:

    1 let someValue = matrix[2, 2]
    2 // this triggers an assert, because [2, 2] is outside of the matrix bounds
  • 相关阅读:
    JavaScript对原始数据类型的拆装箱操作
    Javascript继承(原始写法,非es6 class)
    动态作用域与词法作用域
    自行车的保养
    探索JS引擎工作原理 (转)
    C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库
    C语言提高 (6) 第六天 文件(续) 链表的操作
    C语言提高 (5) 第五天 结构体,结构体对齐 文件
    C语言提高 (4) 第四天 数组与数组作为参数时的数组指针
    C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间
  • 原文地址:https://www.cnblogs.com/tt2015-sz/p/4871145.html
Copyright © 2011-2022 走看看