我正在使用Xcode 6的游乐场试用Swift中的枚举:
enum Rank: String
{
case One = "One", Two="Two"
init(rawValue : String)
{
self.rawValue = rawValue
}
}
我想覆盖init,以便可以使用它的rawValue作为参数初始化枚举。但是我收到了一个错误:
但根据Apple's Swift guide我的代码应该是正确的。
答案 0 :(得分:14)
枚举之间的转换方法及其原始值在Xcode 6.0之间发生了变化
和Xcode 6.1。 fromRaw()
和toRaw()
方法已被替换为
a(可用)初始值设定项和rawValue
属性:
Xcode 6.0:
// raw value to enum:
if let rank = Rank.fromRaw("One") { }
// enum to raw value:
let str = rank.toRaw()
Xcode 6.1:
// raw value to enum:
if let rank = Rank(rawValue: "One") { }
// enum to raw value:
let str = rank.rawValue
答案 1 :(得分:11)
马丁的回答是完全正确的。
以下是一个不同的视图,可以更直接地回答您的问题。
在Xcode 6.0中,enum
没有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 coalescing operator ??
安全地展开它:
self = Rank.fromRaw(rawValue) ?? One
可避免崩溃,但可能会导致程序出现意外行为。
您在Xcode 6.0中可以做的是让init
返回一个可选值。这个功能在Xcode 6.1中添加了,正是这个新功能允许他们将fromRaw()
从Xcode 6.0中的函数更改为Xcode 6.1中的可选初始化程序。