enum的rawValue属性无法识别

时间:2014-10-18 20:14:06

标签: swift enums

我正在使用Xcode 6的游乐场试用Swift中的枚举:

enum Rank: String
{
    case One = "One", Two="Two"

    init(rawValue : String)
    {
        self.rawValue = rawValue
    }
}

我想覆盖init,以便可以使用它的rawValue作为参数初始化枚举。但是我收到了一个错误:

enter image description here

但根据Apple's Swift guide我的代码应该是正确的。

2 个答案:

答案 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中的可选初始化程序。