我正在使用Xcode 6的游乐场试用Swift中的枚举:
enum Rank: String
{
case One = "One", Two="Two"
init(rawValue : String)
{
self.rawValue = rawValue
}
}
Run Code Online (Sandbox Code Playgroud)
我想重写init,以便可以使用它的rawValue作为参数初始化枚举.但是我收到一个错误:

但根据Apple的Swift指南,我的代码应该是正确的.
Mar*_*n R 14
枚举之间的转换方法及其原始值在Xcode 6.0和Xcode 6.1之间发生了变化.的fromRaw()和toRaw()方法已被替换为(failable)初始化和一个rawValue属性:
Xcode 6.0:
// raw value to enum:
if let rank = Rank.fromRaw("One") { }
// enum to raw value:
let str = rank.toRaw()
Run Code Online (Sandbox Code Playgroud)
Xcode 6.1:
// raw value to enum:
if let rank = Rank(rawValue: "One") { }
// enum to raw value:
let str = rank.rawValue
Run Code Online (Sandbox Code Playgroud)
vac*_*ama 11
马丁的回答是完全正确的.
这是一个不同的视图,更直接地回答您的问题.
在Xcode 6.0中,a enum没有rawValue属性. rawValue在Xcode 6.1中添加了,但请注意它是一个只读的计算属性,因此您也无法在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)
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是fromRaw返回一个可选的枚举值,因为该rawValue字符串可能对应于任何枚举值.
那么你现在做什么呢?你可以添加一个!强制解包值:
self = Rank.fromRaw(rawValue)!
Run Code Online (Sandbox Code Playgroud)
但如果您尝试创建具有无效原始值的枚举,则会崩溃.
您可以将其中一个枚举值视为默认值,并使用nil coalescing运算符 ??安全地展开它:
self = Rank.fromRaw(rawValue) ?? One
Run Code Online (Sandbox Code Playgroud)
这可以避免崩溃,但可能会导致您的程序出现意外行为.
在Xcode 6.0中你不能做的是init返回一个可选值.这个功能在Xcode 6.1中添加,正是这个新功能允许他们fromRaw()从Xcode 6.0中的函数更改为Xcode 6.1中的可选初始化程序.