import UIKit
//数组和字典的取值都是用的下标
//可以自定义下标的具体实现
//可以为类、结构体和枚举定义下标
//下标的形参和返回值都是可以任意类型的。
//下标可以使用变量参数和可变参数,但不能使用输入输出参数
//===下标语法===
/*
subscript(index:Int) -> Int {
get{
//返回与形参匹配的Int类型值
}
set(newValue){
//执行赋值操作
}
}
*/
//=====列子=====
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int{
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier:3)
let answer = threeTimesTable[6] //返回18
//--------下标的重载-----------
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = [Double](count: rows * columns, repeatedValue: 0.0)
//或者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: row, column:column), "Index out ofrange")
return grid[(row * columns) + column]
}
set{
assert(indexIsValidForRow(row: row, column:column), "Index out ofrange")
grid[(row * columns) + column] = newValue
}
}
subscript(row: Int) -> Double{
get{
assert(indexIsValidForRow(row: row, column: 1), "Index out of range")
return grid[(row * columns) + 1]
}
set{
assert(indexIsValidForRow(row: row, column: 1), "Index out of range")
grid[(row * columns) + 1] = newValue
}
}
}
var matrix = Matrix(rows: 2, columns: 2)
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
matrix[1] = 4.4 //使用重载下标方法
matrix
class Person {
var age: Int
var base: Double
init(age: Int, base: Double){
self.age = age
self.base = base
}
subscript(age: Int) -> Double {
get{
switch age {
case 0...20 : return 1.5 * base
case 21...35 : return 2.5 * base
case 36...45 : return 3.5 * base
default : return 4 * base
}
}
set{
base = newValue
}
}
}
let person = Person(age: 25, base: 5000)
person[33] //返回2.5*5000
person[43] //返回3.5*5000
person[43]=10000
person[50] //返回4*10000