我试图用下面的话把这个问题归结为最简单的形式.

安装程序

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?'

笔记

  1. the Swift Language Guide人:

    如果使用原始值类型定义枚举,则枚举会自动接收一个初始值设定项,该初始值设定项接受原始值类型的值(作为名为rawValue的参数),并返回枚举成员或nil.

  2. MyEnum的自定义初始值设定项是在一个扩展中定义的,用于测试枚举的原始值初始值设定项是否因为以下情况而从the Language Guide中删除.然而,它实现了相同的错误结果.

    请注意,如果为值类型定义自定义初始值设定项,则将不再有权访问该类型的默认初始值设定项(或memberwise初始值设定项,如果它是 struct ).[...]

  3. 将枚举定义移动到MyClass.swift可以解决bar的错误,但不能解决foo的错误.

  4. 删除自定义初始值设定项可以解决这两个错误.

  5. 一种解决方法是在枚举定义中包含以下函数,并使用它代替提供的原始值初始值设定项.因此,添加自定义初始值设定项似乎具有与标记原始值初始值设定项private类似的效果.

    init?(raw: Int) {
        self.init(rawValue: raw)
    }
    
  6. MyClass.swift中将协议一致性显式声明为RawRepresentable可以解决bar的内联错误,但会导致关于重复符号的链接器错误(因为原始值类型枚举隐式符合RawRepresentable).

    extension MyEnum: RawRepresentable {}
    

有人能提供更多关于这里发生的事情的见解吗?为什么原始值初始值设定项不可访问?

推荐答案

这个错误在Xcode 7和Swift 2中得到了解决

Swift相关问答推荐

为表单部分赋予背景 colored颜色 /渐变

为什么在Swift属性Wrapper中需要类型注释?

带有文本输入自动大小写修饰符的SwiftUI Textfield问题

按SWIFT中每个ID的最大值进行筛选/排序

在Swift中,将秒设置为0也等于将1添加到分钟

物理主体未与 spritekit Swift 的网格图案上的纹理图像对齐

在PrimitiveSequence上引用实例方法xxx需要类型A和any B等效

ConfirmationDialog取消swiftui中的错误

如何在 SceneKit 上制作毛玻璃效果

String(validatingUTF8:) 和 String(utf8String:) 之间有区别吗?

如何判断一个值是否为 Int 类型

使用泛型的 Swift 枚举值

如何在 SwiftUI 中用图像替换占位符文本?

按钮图像不会立即刷新

更改该函数的参数之一时,如何将这些 SwiftUI 异步任务合并到一个任务中以从函数中获得正确的结果

如何在不阻塞 UI 更新的情况下使用 Swift Concurrency 在后台执行 CPU 密集型任务?

Xcode 6 中的嵌入式内容包含 Swift 代码构建设置有什么作用?

你如何在 UIBarItem 中使用 setTitleTextAttributes:forState?

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

Swift中方法的弃用和其他属性,如何?