enum Season: Int {
case Spring = 0
case Summer = 1
case Autumn = 2
case Winter = 3
}
var SeasonTime1 = Season.Spring
//why ? this code suffix need add !
SeasonTime1 = Season.init(rawValue: 2)!
答案 0 :(得分:0)
因为编译器无法推断原始值类型存在,所以您需要'!'太强迫打开它。如果你将它包装在一个保护声明中,你可以确保它的类型是"你"知道它是。那你就不需要'!'
答案 1 :(得分:0)
这是因为Enum使用了一个可用的初始化程序(参见文档here)。正如其标题所暗示的那样,可用的启动器可能会失败并返回nil。可以包含nil的对象是Swift中的Optionals。因此你可以:
let seasonTime1 = Season.init(rawValue: 2)
在这种情况下,seasonTime1的类型为Optional<Season>
。如果要使用该值,则必须使用if let
,guard
或!
解包可选项。在这种情况下:
let seasonTime1 = Season.init(rawValue: 2)!
您正在立即展开它,因此seasonTime1的类型将为Season
。请注意以下代码:
let seasonTime1 = Season.init(rawValue: 2222)!
这将运行,但如果您访问seasonTime1,它将失败。这是因为没有枚举的原始值为2222,因此seasonTime1将包含nil。由于它是隐式展开的,因此它包含nil的事实是非法的,如果发生展开会导致崩溃。