我试图用下面的话把这个问题归结为最简单的形式.
安装程序
Xcode版本6.1.1(6A2008a)
MyEnum.swift
中定义的枚举:
internal enum MyEnum: Int {
case Zero = 0, One, Two
}
extension MyEnum {
init?(string: String) {
switch string.lowercaseString {
case "zero": self = .Zero
case "one": self = .One
case "two": self = .Two
default: return nil
}
}
}
以及在另一个文件MyClass.swift
中初始化枚举的代码:
internal class MyClass {
let foo = MyEnum(rawValue: 0) // 错误
let fooStr = MyEnum(string: "zero")
func testFunc() {
let bar = MyEnum(rawValue: 1) // 错误
let barStr = MyEnum(string: "one")
}
}
错误
在try 使用原始值初始值设定项初始化MyEnum
时,Xcode给了我以下错误:
Cannot convert the expression's type '(rawValue: IntegerLiteralConvertible)' to type 'MyEnum?'
笔记
-
如果使用原始值类型定义枚举,则枚举会自动接收一个初始值设定项,该初始值设定项接受原始值类型的值(作为名为
rawValue
的参数),并返回枚举成员或nil
. -
MyEnum
的自定义初始值设定项是在一个扩展中定义的,用于测试枚举的原始值初始值设定项是否因为以下情况而从the Language Guide中删除.然而,它实现了相同的错误结果.请注意,如果为值类型定义自定义初始值设定项,则将不再有权访问该类型的默认初始值设定项(或memberwise初始值设定项,如果它是 struct ).[...]
将枚举定义移动到
MyClass.swift
可以解决bar
的错误,但不能解决foo
的错误.删除自定义初始值设定项可以解决这两个错误.
-
一种解决方法是在枚举定义中包含以下函数,并使用它代替提供的原始值初始值设定项.因此,添加自定义初始值设定项似乎具有与标记原始值初始值设定项
private
类似的效果.init?(raw: Int) { self.init(rawValue: raw) }
-
在
MyClass.swift
中将协议一致性显式声明为RawRepresentable
可以解决bar
的内联错误,但会导致关于重复符号的链接器错误(因为原始值类型枚举隐式符合RawRepresentable
).extension MyEnum: RawRepresentable {}
有人能提供更多关于这里发生的事情的见解吗?为什么原始值初始值设定项不可访问?