使用自定义初始化程序的Swift枚举会丢失rawValue初始化程序

昵称:

我已尝试通过以下方法将此问题简化为最简单的形式。

建立

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)  // Error
    let fooStr = MyEnum(string: "zero")

    func testFunc() {
        let bar = MyEnum(rawValue: 1)  // Error
        let barStr = MyEnum(string: "one")
    }
}

错误

尝试MyEnum使用原始值初始化程序进行初始化时,Xcode给我以下错误

Cannot convert the expression's type '(rawValue: IntegerLiteralConvertible)' to type 'MyEnum?'

笔记

  1. 根据《 Swift语言指南》

    如果您使用原始值类型定义枚举,则枚举会自动接收一个初始化程序,该初始化程序采用原始值类型的值(作为称为的参数rawValue),并返回枚举成员或nil

  2. MyEnum在扩展程序中定义了的自定义初始化程序,以测试是否由于《语言指南》中的以下情况而删除了枚举的原始值初始化程序但是,它获得相同的错误结果。

    请注意,如果您为值类型定义自定义初始化程序,则将不再有权使用该类型的默认初始化程序(或成员初始化程序,如果它是结构)。[...]
    如果您希望自定义值类型可以使用默认的初始化程序和成员初始化程序以及自己的自定义初始化程序进行初始化,请在扩展名中编写自定义初始化程序,而不要将其作为值类型的原始实现的一部分。

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

  4. 删除自定义初始化程序可解决两个错误。

  5. 一种解决方法是在枚举定义中包括以下功能,并代替提供的原始值初始化程序使用它。因此,似乎添加自定义初始化程序与标记原始值初始化程序具有相似的效果private

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

    extension MyEnum: RawRepresentable {}
    

任何人都可以对这里发生的事情提供更多的见解吗?为什么无法访问原始值初始化程序?

与我的alcam:

此错误已在Xcode 7和Swift 2中解决

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift:自定义ViewController初始化程序

枚举不适用于自定义初始化程序

用NS_ENUM的rawValue初始化程序定义的枚举不会失败

自定义类型需要使用auto进行初始化的初始化程序吗?

使用内联初始化程序时,Swift类初始化会崩溃

使用自定义初始化程序swift以编程方式实例化和推送视图控制器

如何在keras自定义正则化程序中使用初始化的图层权重?

WorkManager-当我们同时使用默认初始化和自定义初始化时,是否应该删除默认初始化程序?

在Swift中为自定义NSView提供指定的初始化程序

如何在Swift中为UIViewController子类创建自定义初始化程序?

Swift 初始化程序

致命错误:在自定义NavigationController中使用未实现的初始化程序

如何在UITableViewCell上使用自定义初始化程序?

如何在UICollectionViewCompositionalLayout中使用UICollectionViewController的自定义初始化程序?

从.sks文件使用自定义初始化程序进行子类化

无法使用自定义数据库初始化程序

自定义初始化程序应使用哪种类型的参数?

快速创建不带自定义名称参数的自定义初始化程序

自定义绑定初始化

如何简化Swift Enum自定义初始化

Swift子类会继承初始化程序吗?

重载>>运算符,并使用自定义类型的初始化列表初始化

UILabel子类使用自定义颜色初始化

如何使用自定义属性初始化 SparkContext?

使用@Namespace进行.matchedGeometryEffect的自定义初始化

使用自定义ChangeNotifier初始化riverpod Provider

初始化前使用的自定义变量“层”

具有依赖项初始化错误的自定义程序包:ModuleNotFoundError或ImportError

Emberjs:如何在自定义身份验证初始化程序中使会话无效