【发布时间】: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 的表情符号自然处理编译器。现在。