从房产的原始价值中获取枚举

时间:2017-08-05 14:11:34

标签: swift swift3 enums

鉴于以下枚举:

enum Characters: String {

    case Joe, Frank, Jimmy

    var hairColor: String {
        switch self {
            case .Joe: return "Brown"
            case .Frank: return "Black"
            case .Jimmy: return "Blond"
        }
    }

    var style: String {
        switch self {
            case .Joe: return "Cool"
            case .Frank: return "Bad"
            case .Jimmy: return "Silent"
        }
    }
}

我希望能够使用rawValue从其中一个属性的字符串中获取枚举。所以,我可以做的地方:

let newGuy = Characters(rawValue: "Joe")

并获得.Joe,我也希望能够:

let newGuy = Characters(rawValue: "Cool")

并获取.Joe

let newGuy = Characters.style(rawValue: "Cool")

不适用于错误:

  

实例成员'style'不能用于'Character'类型

2 个答案:

答案 0 :(得分:2)

由于stylehairColor与原始值无关,因此您必须添加适当的初始值设定项,例如

 init?(style: String) {
    switch style {
    case "Cool": self = .Joe
    case "Bad": self = .Frank
    case "Silent": self = .Jimmy
    default: return nil
    }
 }

为什么不反过来......

struct Person {

    enum HairColor {
        case brown, black, blond
    }

    enum Style {
        case cool, bad, silent
    }

    let name : String
    var hairColor : HairColor
    var style : Style
}

答案 1 :(得分:1)

如果您希望能够基于实例属性值创建枚举,则需要创建自己的初始值设定项。使用当前的实现,haircolor / style和Character本身之间没有相互关联。实例属性(haircolor / style)取决于Character,但另一种方式是没有关系。

你必须为style和hairColor创建一个初始化器,我为它做了样式,你可以用类似的方式为hairColor做。

请参阅以下代码:

enum Characters: String {

    case Joe, Frank, Jimmy

    var hairColor: String {
        switch self {
        case .Joe: return "Brown"
        case .Frank: return "Black"
        case .Jimmy: return "Blond"
        }
    }

    var style: String {
        switch self {
        case .Joe: return "Cool"
        case .Frank: return "Bad"
        case .Jimmy: return "Silent"
        }
    }

    init(style: String){
        switch style {
        case "Cool":
            self = Characters.Joe
        case "Bad":
            self = Characters.Frank
        default:
            self = Characters.Jimmy
        }
    }
}

Characters(style: "Bad") //initializes Frank
Characters(rawValue: "Joe")  //works just like before