Swift2-0基础_Subscripts(下标脚本)

import Foundation

print("Hello, World!")

/* 下标脚本     可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,     可以认为是访问集合(collection),列表(list)或序列(sequence的快捷方式,     使用下标脚本的索引设置和获取值,不需要 再调用实例的特定的赋值和访问方法。     用下标脚本访问一个数组(Array)实例中的元素可以这样写 meArray[index],     访问字典(Dictionary)实例中的元素可以这样写 someDictionary[key] 。     对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,     下标脚本不限于单个纬度,你可以定义多个入参的下标脚本满足自定义类型的需求。 */

// 1 下标脚本语法
/*     下标脚本允许通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值。     语法类似于实例方法和计算型属性的混合。与定义实例方法类似,定义下标脚本使用 subscript 关键字,显式声明入参(一个 或多个)和返回类型。     与实例方法不同的是下标脚本可以设定为读写或只读。这种方式又有点像计算型属性的getter和setter: */

class Person {
    subscript (index: Int) -> Int {
    get {
        // 返回与入参匹配的Int类型的值
        return 0
    }
    // newValue 的类型必须和下标脚本定义的返回类型相同
    set(newValue) {
        // 赋值操作
    }
    }
}

// 只读下标脚本   直接将原本应该写在 get 代码块中的代码写在 subscript 中
struct TimesTable {
    let multipiler : Int
    subscript(index:Int) -> Int {
        return multipiler * index
    }
}
let twoTimesTable = TimesTable(multipiler: 2)
print(twoTimesTable[5]) // 10

// 2 下标脚本的用法
// 通常下标脚本是用来访问集合(collection),列表(list)或序列(sequence)中元素的快捷方式。
// 可以在特定的类或结构体中自由的实现下标脚本来提供合适的功能。
// 创建字典
var numberOfLegs = ["splider":8,"ant":6,"cat":4]
// 赋值
numberOfLegs["bird"] = 2

// 3 下标脚本选项
/*     下标脚本允许任意数量的入参索引,并且每个入参类型也没有限制。下标脚本的返回值也可以是任何类型。     下标脚本可以使用变量参数和可变参数,但使用写入读出(in-out)参数或给参数设置默认值都是不允许的。     一个类或结构体可以根据自身需要提供多个下标脚本实现,在定义下标脚本时通过入参的类型进行区分,         使用下标脚本时会自动匹配合适的下标脚本实现运行,这就是[下标脚本的重载] */
// Matrix 提供了一个两个入参的构造方法,入参分别是 rows 和 columns ,创建了一个足够容纳 rows * columns 个数的 Double 类型数组
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: columns), "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)

你可能感兴趣的:(索引,swift,Subscripts)