Swift:下标专题

本文详细探讨了Swift编程中的下标操作,包括如何定义和使用下标的get和set方法,以及如何实现多维下标的高效访问。通过对这些概念的理解和实践,开发者可以更灵活地操纵数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值