一.类的下标方法
类、结构体和枚举可以定义下标,它可以作为访问集合、列表或序列成员元素的快捷方式。可使用下标通过索引值来设置或检索值而不需要为设置和检索分别使用实例方法。
可以为一个类型定义多个下标,并且下标会基于传入的索引值的类型选择合适的下标重载使用。下标没有限制单个维度,你可以使用多个输入形参来定义下标以满足自定义类型的需求。
下标脚本允许通过在实例名后面的方括号内写一个或多个值对该类的实例进行查询。它的语法类似于实例方法和计算属性。使用关键字subscript来定义下标,并且指定一个或多个输入形式参数和返回类型,与实例方法一样。与实例方法不同的是,下标可以是读写也可以是只读的。
//下标方法
struct Matrix {
let rows: Int
let columns: Int
var grid: [Double]
init(row: Int, cloumns: Int) {
self.rows = row
self.columns = cloumns
grid = Array(repeating: 0.0, count: row * cloumns)
}
subscript(row: Int, cloumns: Int) -> Double {
get {
return grid[row * cloumns + cloumns]
}
set {
grid[row * cloumns + cloumns] = newValue
}
}
}
var matrix = Matrix(row: 2, cloumns: 2)
matrix[1, 0] = 9.9
matrix[0, 1] = 8.8
print(matrix) //输出:Matrix(rows: 2, columns: 2, grid: [9.9, 8.8, 0.0, 0.0])
print(matrix[1, 0]) //输出:9.9
二.extension扩展结构体、枚举、类
扩展为现有的类、结构体、枚举类型、或协议添加了新功能。这也包括了为无访问权限的源代码扩展类型的能力。扩展和 Objective-C 中的 category 类似。
1.添加计算实例属性和计算类型属性(扩展不能添加存储属性,因为类被实例化后,内存空间是确定了,添加存储属性需要内存空间,会改变原有的内存结构。类比OC的分类不能添加实例变量、属性)
2.定义实例方法和类型方法
3.提供新初始化器
4.定义下标
5.定义和使用新内嵌类型
6.使现有的类型遵循某协议
7.扩展可以向一个类型添加新的方法,但是不能重写已有的方法
//扩展,添加计算属性
extension Double {
var km: Double {
return self / 1000.0
}
}
//添加方法
extension Int {
func repeatTask(task: ()->()) {
for _ in 0..<self {
task()
}
}
}
4.repeatTask {
print("nihao")
}
//扩展下标
extension Int {
subscript(digitIndex: Int) -> Int {
get {
var base = 1
for _ in 0..<digitIndex {
base *= 10
}
return (self / base) % 10
}
}
}
//扩展内嵌函数
extension Int {
enum Kind {
case zero
case negative
case positivw
}
var kind: Kind {
get {
switch self {
case 0:
return .zero
case let x where x > 0 :
return .negative
default:
return .positivw
}
}
}
}
print(0.kind)