1. 下标的get和set方法
import Foundation
struct Vector3 {
var x: Double = 0.0
var y: Double = 0.0
var z: Double = 0.0
subscript(index: Int) -> Double? { // index是方括号中的内容
// get函数
get {
switch index {
case 0:
return x
case 1:
return y
case 2:
return z
default:
return nil
}
}
// set函数
set {
if let newValue = newValue {
switch index {
case 0:
x = newValue
case 1:
y = newValue
case 2:
z = newValue
default:
return
}
}
}
}
}
var v = Vector3()
v[0]
v[0] = 1
2. 多维下标
import Foundation
class Matrix {
var data: [[Double]]
let r: Int
let c: Int
init(row: Int, col: Int) {
self.r = row
self.c = col
data = [[Double]]()
for _ in 0 ..< r {
let arr = Array<Double>(repeating: 0, count: col)
data.append(arr)
}
}
subscript(x: Int, y: Int) -> Double{
get {
assert(x >= 0 && x < r && y >= 0 && y < c)
return data[x][y]
}
set {
assert(x >= 0 && x < r && y >= 0 && y < c)
data[x][y] = newValue
}
}
// 如果想和C语言中的二维数组保持一致,即可以用m[][]的方式来获取就要再次定义下标
subscript(x: Int) -> [Double] {
get {
assert(x >= 0 && x < r, "Out of Index") // 获取值得时候只用判断x就可以了
return data[x]
}
set(vector) { // 这里用vector不是很合适,因为是一个向量
assert(vector.count == c, "Column number DONT match") // 这里要修改值,要判断是否符合矩阵定义
data[x] = vector
}
}
}
var m = Matrix(row: 3, col: 3)
m[1, 2]
m[2, 2]
m[0, 0] = 100
m[0, 0]
m[0]
m[0] = [1, 2, 3] // 可写
// 下面的,只有第一个[0]是下标定义的,返回一个[Double],后面是系统自己定义的,数组本来就可以通过[]来访问
m[0][0] // 注意这里的m是结构体类型,而不是二维数组,所以如果想这样写一定要自己去定义下标