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
相关产品推荐
相关产品推荐

