尝试创建一个2D查找表,其中包含表示swift 4中表格轴的枚举,例如:
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)
(不,我没有在Swift中编写嵌入式PCM代码(这很有趣!),但它是我尝试使用的快速构造的一个简单示例,但是没有想出了语法)
如何分配&使用枚举作为索引来检索数组中的值,例如假设元素已经创建
timingRetard[cool][idle] = 0.0
timingRetard[cool][cruise] = 0.0
timingRetard[cool][wot] = 0.0
timingRetard[above_range][wot] = -8.0
timingRetard[normal][cruise] = 0.0
如果在给定每个轴的枚举数量的情况下初始化数组后,如何声明Swift数组的索引类型只能由枚举类型访问?我想我可以在一个结构中添加timingRetard并声明一个下标方法来将索引限制为枚举类型,但是还没有让它工作。
答案 0 :(得分:1)
实现的一种方法是覆盖struct中的下标方法。它解释得更好here。我使用链接中提到的示例以这种方式解决您的问题:
enum ECT: Int{
case cool = 0
case normal
case above_range
}
enum Load: Int {
case idle = 0
case cruise
case wot
}
struct TimingRetard2D {
let rows: Int, cols: Int
private(set) var array:[Double?]
init(rows: Int, cols: Int, repeating:Double?) {
self.rows = rows
self.cols = cols
array = Array(repeating: repeating, count: rows * cols)
}
private func indexIsValid(row: Int, col: Int) -> Bool {
return row >= 0 && row < rows && col >= 0 && col < cols
}
subscript(row: ECT, col: Load) -> Double? {
get {
assert(indexIsValid(row: row.rawValue, col: col.rawValue), "Index out of range")
return array[(row.rawValue * cols) + col.rawValue]
}
set {
assert(indexIsValid(row: row.rawValue, col: col.rawValue), "Index out of range")
array[(row.rawValue * cols) + col.rawValue] = newValue
}
}
}
var timingRetard = TimingRetard2D.init(rows: 3, cols: 3, repeating: nil)
timingRetard[.cool, .idle] = 0.0
timingRetard[.cool, .cruise] = 0.0
timingRetard[.cool, .wot] = 0.0
timingRetard[.above_range, .wot] = -8.0
timingRetard[.normal, .cruise] = 0.0
print(timingRetard.array)
<强>输出:强>
[可选(0.0),可选(0.0),可选(0.0),nil,可选(0.0),nil,nil,nil,可选(-8.0)]
答案 1 :(得分:0)
对Puneet解决方案进行微小更新,该解决方案允许数组数组而不是将偏移计算为单维数组:
p + facet_grid(group ~ ., scales = "free")
然而,是否还要使结构的使用者也使用2D数组语法?例如timingRetards [.cool] [。WOT]
答案 2 :(得分:0)
你可以这样写:
extension Array where Element == Double? {
subscript(load: Load) -> Element {
get {
return self[load.rawValue]
}
set {
self[load.rawValue] = newValue
}
}
}
extension Array where Element == [Double?] {
subscript(ect: ECT) -> Element {
get {
return self[ect.rawValue]
}
set {
self[ect.rawValue] = newValue
}
}
}
var timingRetard = [[Double?]](repeating: [nil,nil,nil], count: 3)
timingRetard[.cool][.idle] = 0.0
timingRetard[.cool][.cruise] = 0.0
timingRetard[.cool][.wot] = 0.0
timingRetard[.above_range][.wot] = -8.0
timingRetard[.normal][.cruise] = 0.0
但是,扩展TimingRetard2D
似乎更好。