enum PtzButton: Int {
case play = 1
case up = 2
case stop = 3
case left = 4
case none = 5
case right = 6
case zoomIn = 7
case down = 8
case zoomOut = 9
internal static let ptzActionMap: [PtzButton: PtzAction] = [
.up: .up,
.down: .down,
.left: .left,
.right: .right,
.zoomIn: .zoomIn,
.zoomOut: .zoomOut
]
var ptzAction: PtzAction? {
return PtzButton.ptzActionMap[self]
}
}
Run Code Online (Sandbox Code Playgroud)
这PtzAction是一个模型枚举。这PtzButton是一个视图绑定枚举。它们非常相似,但PtzButton不仅仅是案例。它必须知道,它们有不同的 rawValue 定义,我不应该改变它们。
所以,我的问题是:有没有更好的方法来简化ptzActionMap代码?
我猜这些重复的代码太罗嗦了:
[.up: .up,
.down: .down,
.left: .left,
.right: .right,
.zoomIn: .zoomIn,
.zoomOut: .zoomOut]
Run Code Online (Sandbox Code Playgroud)
我会使用一个switch表达式:
enum PtzButton: Int {
case play = 1, up, stop, left, none, right, zoomIn, down, zoomOut
var ptzAction: PtzAction? {
switch self {
case .up: return .up
case .down: return .down
case .left: return .left
case .right: return .right
case .zoomIn: return .zoomIn
case .zoomOut: return .zoomOut
default : return nil
}
}
}
let button = PtzButton.right
if let action = button.ptzAction {
print(action.rawValue)
}
Run Code Online (Sandbox Code Playgroud)
或者映射原始值:
enum PtzAction : Int {
case up = 1, down, left, right, zoomIn, zoomOut
}
enum PtzButton: Int {
case play = 1, up, stop, left, none, right, zoomIn, down, zoomOut
static let actionRawValues = [0, 1, 0, 3, 0, 4, 5, 2, 6]
}
let button = PtzButton.down
let actionRaw = PtzButton.actionRawValues[button.rawValue - 1] // zero based index
if let action = PtzAction(rawValue: actionRaw) {
print(action.rawValue)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1950 次 |
| 最近记录: |