鉴于以下枚举:
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'类型
答案 0 :(得分:2)
由于style
和hairColor
与原始值无关,因此您必须添加适当的初始值设定项,例如
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