Swift:下标专题

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是结构体类型,而不是二维数组,所以如果想这样写一定要自己去定义下标

 

猜你喜欢

转载自blog.csdn.net/shijie97/article/details/84136467
今日推荐