Swift-下标脚本

来源:互联网 发布:coreldraw x5软件下载 编辑:程序博客网 时间:2024/06/04 15:21
//: Playground - noun: a place where people can playimport UIKitvar str = "Hello, playground"//下标脚本语法/* 下标脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值。语法类似于实例方法和计算型属性的混合。与定义实例方法类似,定义下标脚本使用subscript关键字,显式声明入参(一个或多个)和返回类型。与实例方法不同的是下标脚本可以设定为读写或只读。这种方式又有点像计算型属性的getter和setter: */class SomeClass {       subscript(index: Int) -> Int{                get{                        //返回与入参数的Int类型的值                        return index ;        }                set(newValue){                    }            }    }//下面代码演示了一个在TimesTable结构体中使用只读下标脚本的用法,该结构体用来展示传入整数的n倍。struct TimesTable {    let multiplier: Int?    subscript(index: Int) ->Int {                return multiplier! * index ;    }    }let threeTimesTable = TimesTable(multiplier: 3);print("3的6倍是\(threeTimesTable[6])");/* 在上例中,通过TimesTable结构体创建了一个用来表示索引值三倍的实例。数值3作为结构体构造函数入参初始化实例成员multiplier。  你可以通过下标脚本来得到结果,比如threeTimesTable[6]。这条语句访问了threeTimesTable的第六个元素,返回6的3倍即18。  注意: TimesTable例子是基于一个固定的数学公式。它并不适合对threeTimesTable[someIndex]进行赋值操作,这也是为什么附属脚本只定义为只读的原因。 *///下标脚本用法/* 例如,Swift 的字典(Dictionary)实现了通过下标脚本来对其实例中存放的值进行存取操作。在下标脚本中使用和字典索引相同类型的值,并且把一个字典值类型的值赋值给这个下标脚本来为字典设值: *//** 注意: Swift 中字典的附属脚本实现中,在get部分返回值是Int?,上例中的numberOfLegs字典通过附属脚本返回的是一个Int?或者说“可选的int”,不是每个字典的索引都能得到一个整型值,对于没有设过值的索引的访问返回的结果就是nil;同样想要从字典实例中删除某个索引下的值也只需要给这个索引赋值为nil即可。 */var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4] ;numberOfLegs["bird"] = 2 ;print(numberOfLegs);//下标脚本选项/* 下标脚本允许任意数量的入参索引,并且每个入参类型也没有限制。下标脚本的返回值也可以是任何类型。下标脚本可以使用变量参数和可变参数,但使用写入读出(in-out)参数或给参数设置默认值都是不允许的。  一个类或结构体可以根据自身需要提供多个下标脚本实现,在定义下标脚本时通过入参个类型进行区分,使用下标脚本时会自动匹配合适的下标脚本实现运行,这就是下标脚本的重载。  一个下标脚本入参是最常见的情况,但只要有合适的场景也可以定义多个下标脚本入参。如下例定义了一个Matrix结构体,将呈现一个Double类型的二维矩阵。Matrix结构体的下标脚本需要两个整型参数: */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        }    }}

0 0