如何简化Swift Enum自定义初始化

aru*_*iva 2 swift

我已经创建了一个String类型的枚举。它有两种初始化方法。一个是带有rawValue的默认init方法,另一个是带有intValue的自定义init方法。我是这样写的。有什么简单的方法可以不使用两个开关盒?

enum Roman: String {
    case I,V,X,L,C,D,M

    var intValue: Int {
        switch self {
        case .I:
            return 1
        //...
        }
    }
    init?(intValue: Int) {
        switch intValue {
        case 1:
            self = .I
        //...
        default:
            return nil
        }
    }
}

    //Roman to Int
    let number = "XXI".reversed()
                    .map { Roman(rawValue: String($0))?.intValue ?? 0 }
                    .reduce((total: 0, max: 0)) { result, value in
                        let newTotal = result.total + (value < result.max ? -value : value)
                        return (newTotal, max(result.max, value))
                    }.total
Run Code Online (Sandbox Code Playgroud)

Dáv*_*tor 6

您可以switch通过为Int值和enum cases 之间的双向映射定义两个字典来摆脱这些语句。

enum Roman: String {
    case I, V, X, L, C, D, M

    private static let intValues:[Roman:Int] = [.I:1,.V:5,.X:10,.L:50,.C:100,.D:500,.M:1000]
    private static let mappingDict:[Int:Roman] = Dictionary(uniqueKeysWithValues: Roman.intValues.map({ ($1, $0) }))

    var intValue:Int {
        return Roman.intValues[self]!
    }

    init?(intValue:Int){
        guard let roman = Roman.mappingDict[intValue] else { return nil }
        self = roman
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @arunsiva为什么要使用元组数组?由于不断地查找元素,因此“字典”的工作速度更快。 (2认同)
  • @arunsiva,使用“数组”的查找将是“ O(n)”,使用“字典”的查找将是“ O(1)”。因此,平均而言,您的`intValue`和`init?(intValue:)`版本将花费更多时间。 (2认同)