【问题标题】:Swift ENUMS - Why is it yelling at me to implicitly unwrap in my enum initializer? It's forcing meSwift ENUMS - 为什么在我的枚举初始化程序中隐式展开时对我大喊大叫?它强迫我
【发布时间】:2016-11-21 02:21:11
【问题描述】:

在本例中,在 Seasons 枚举中,初始化程序强制我添加“!”在“self”的初始化程序末尾隐式展开。如果我删除“!”,我会收到错误:“可选类型 Seasons 的值?未展开..您的意思是使用 '!' 还是 '?'...

起初我认为这与使用 rawValue 方法有关,并且可能 Swift 足够聪明,知道用户输入的值可能不是实际值,因此它自动将其设为可选值,但是,当您可以在下面看到,在 Seasons 命名空间之外,我创建了一个常量下降,并再次使用 rawValue 方法,这次它完美无误地工作。

所以我的问题是,在这种情况下,特别是什么让 Swift 在分配给 SELF 时创建了一个可选项,但是当我不分配给 SELF 时,Swift 完全允许它在没有可选项的情况下正常运行?

谢谢

enum Seasons : String {
    case fall
    case winter
    case spring
    case summer

    static var possibleCases : [Seasons] = [.fall, .winter, .spring, .summer]

    init(_ val: String) {
        self = Seasons(rawValue: val)!
    }
}


let fall = Seasons(rawValue: "fall")

【问题讨论】:

  • 查看fall 的类型——它将是Seasons? 类型。同样在可选项上使用! 不是隐式展开,它是显式
  • init?(rawValue:) 是一个可失败的初始化器。你对Seasons(rawValue: "⛄️") 有什么期望? (编译器不够聪明,无法将其翻译成.winter :)
  • @MartinR 我需要一个 Swift 4 的表情符号自然处理编译器。现在。

标签: swift optional


【解决方案1】:

感谢您的回答。我发现直接使用 (rawValue:) 方法调用 Enum 实际上本身就是一个 BUILT IN 初始化程序。就好像每个枚举中已经有一个 init?(rawValue: ) 初始化程序,但是它是构建的并且你看不到它。

而且我的问题是不正确的 - 'fall' 常量实际上是一个可选的。

【讨论】:

  • 在Xcode中,如果你Option-click在let fall = Seasons(rawValue: "fall")中的rawValue,你会看到初始化器的签名。
  • RawRepresentable 协议提供了init?(rawValue:)。具有原始值的枚举隐含地符合它。
  • @AlexanderMomchliov 自我回答比正常回答需要更长的时间(1 或 2 天 IIRC)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多