You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4数组索引类型声明及枚举轴二维查找表操作方法

嘿,针对你提出的两个Swift 4相关问题,我来给你详细解答~

Swift 4 数组索引类型声明与枚举轴二维表操作指南

一、如何声明数组索引的类型

首先要明确:Swift 4 里的标准Array类型,默认索引类型是Array.Index,它本质上和Int等价(毕竟数组是连续有序存储的,索引从0开始递增)。但如果你的需求是用自定义类型作为逻辑索引(比如你示例里的枚举),通常有两种实用思路:

  • 利用RawRepresentable映射到Int索引:如果你的自定义类型(比如枚举)遵循RawRepresentable且原始值是Int,可以直接用原始值对应数组的Int索引,这是最常用的方案(就像你示例里的枚举那样)。
  • 自定义Collection类型:如果需要完全脱离Int索引,你可以自己实现一个遵循Collection协议的类型,把Index关联类型设为你想要的类型,再实现startIndex、endIndex、subscript等必要方法。不过这种方式比较复杂,一般只有特殊场景才需要。

二、枚举作为轴的二维查找表:赋值与取值操作

先修正你示例代码里的小语法错误:count 3要改成count: 3,正确的数组初始化代码如下:

enum ECT: Int { 
    case cool = 0 
    case normal 
    case above_range 
}
enum Load: Int { 
    case idle = 0 
    case cruise 
    case wot 
}
// 修正后的二维数组初始化
var timingRetard = [[Double?]](repeating: [nil, nil, nil], count: 3)

接下来,我们可以借助枚举的rawValue来映射数组索引,轻松实现赋值和取值:

1. 基础赋值与取值

直接通过枚举的原始值获取数组索引,操作起来很直接:

// 赋值:给ECT.cool + Load.idle对应的位置设置值
timingRetard[ECT.cool.rawValue][Load.idle.rawValue] = 1.5
// 再给另一个组合赋值
timingRetard[ECT.normal.rawValue][Load.cruise.rawValue] = 3.2

// 取值:通过可选绑定处理可能的nil值
if let retardValue = timingRetard[ECT.above_range.rawValue][Load.wot.rawValue] {
    print("当前点火延迟值:\(retardValue)")
} else {
    print("该工况下尚未设置延迟值")
}

优化方案:封装自定义下标

每次写rawValue有点繁琐,我们可以给数组扩展一个自定义下标,直接接收枚举作为参数,让代码更简洁直观:

extension Array where Element == [Double?] {
    subscript(ect: ECT, load: Load) -> Double? {
        get {
            return self[ect.rawValue][load.rawValue]
        }
        set(newValue) {
            self[ect.rawValue][load.rawValue] = newValue
        }
    }
}

现在使用起来就像操作普通下标一样自然:

// 赋值
timingRetard[.cool, .idle] = 1.5
timingRetard[.normal, .cruise] = 3.2

// 取值
if let retardValue = timingRetard[.above_range, .wot] {
    print("当前点火延迟值:\(retardValue)")
} else {
    print("该工况下尚未设置延迟值")
}

这样不仅代码可读性更高,还能避免手动写rawValue可能带来的错误。

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:37:49