我正在使用
Xcode 6的游乐场试试
Swift中的枚举:
enum Rank: String { case One = "One",Two="Two" init(rawValue : String) { self.rawValue = rawValue } }
我想覆盖init,以便可以使用它的rawValue作为参数来初始化枚举.但是我收到一个错误:
但是根据Apple’s Swift guide我的代码应该是正确的.
马丁的答案是完全正确的.
这是一个不同的观点,更直接地回答你的问题.
在Xcode 6.0中,枚举没有rawValue属性.在Xcode 6.1中添加了rawValue,但是注意它是一个只读的计算属性,所以你也不能在Xcode 6.1中分配它.
在Xcode 6.1中,没有必要实现一个采用rawValue的初始化程序,因为它已经由本地语言提供了.如果你试图在Xcode 6.0中模仿这种行为,那么你可以尝试一下:
enum Rank: String { case One = "One",Two="Two" init(rawValue : String) { self = Rank.fromRaw(rawValue) } }
但是这样做的问题是fromRaw返回一个可选的枚举值,因为rawValue字符串可能对应于任何枚举值.
那么你现在在做什么呢?你可以添加一个!强制解开该值:
self = Rank.fromRaw(rawValue)!
但是如果您尝试创建具有无效原始值的枚举,则会崩溃.
您可以将其中一个枚举值作为默认值,并使用nil合并运算符?安全地解开它:
self = Rank.fromRaw(rawValue) ?? One
这将避免崩溃,但可能会导致您的程序的意外行为.
在Xcode 6.0中你不能做的是让init返回一个可选的值.此功能在Xcode 6.1中添加,正是这一新功能允许他们从Xcode 6.0中的函数从Xcode 6.1中的可选初始化程序更改为Raw().