2017-03-12 36 views
0
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] 
    } 
} 

PtzAction是一個模型枚舉。 PtzButton是一個視圖綁定枚舉。 他們非常相似,但PtzButton有不止一種情況。 必須注意,它們有不同的rawValue定義,我不應該改變它們。Swift 3:如何根據相同的名稱在枚舉之間進行映射?

所以,我的問題是:有沒有更好的方法來簡化ptzActionMap的代碼?

我想這些重複碼是如此羅嗦:

 [.up: .up, 
     .down: .down, 
     .left: .left, 
     .right: .right, 
     .zoomIn: .zoomIn, 
     .zoomOut: .zoomOut] 

回答

1

我會使用一個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) 
} 

可選地原始值映射:

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) 
} 
+0

感謝您的回答,但我想它還不夠優雅。無論如何避免重複? –

+0

我用第二個建議更新了答案。 – vadian

1

在第一看來,我可能會考慮稍微改變一下。

Swift中的Enum例子可以包含值。以下看起來很優雅 - 雖然可能會或可能不適合你想做的事情。

enum Action { 
    case up, down, left, right, zoomIn, zoomOut 
} 

enum Button { 
    case forAction(Action) 
    case play, stop, none 
} 
+0

感謝您的回答,但這兩個枚舉有自己的rawValue,我不應該改變它。 –

+0

@PMExtra我可以問爲什麼不呢?這個數字似乎沒有必要,任何依賴它的代碼應該能夠被重構爲使用枚舉而不是原始值。 –

+0

'Action.rawValue'綁定到服務器API。 'Button.rawValue'綁定到'UIButton.Tag'(我只做一個IBAction來綁定所有按鈕)。 –