隐式展开的可选枚举投诉

时间:2019-02-07 19:02:31

标签: swift enums optional

此刻,尝试运行以下代码时出现以下错误:enum case good not found in type Situation?enum case bad not found in type Situation?

enum Situation: Error {
        case good
        case bad
}

class SituationHandler {
    var situation: Situation!
    static let shared = SituationHandler()
}

class Scenario {

    func handleScenario() {

        let situation = SituationHandler.shared.situation
        switch situation {
        case .good:
            print("All good")
        case .bad:
            print("All bad")
        }

    }
}

如果我将情境处理程序中的情境用作隐式展开的可选,我是否不应该收到此投诉?我在做什么错了?

感谢所有回答此问题的人。

2 个答案:

答案 0 :(得分:0)

显然,未包装的可选内容仍然是可选内容。如果可以将它们用作常规的可选内容,则将使用它们。

您只需声明非可选类型即可强制展开:

let situation: Situation = SituationHandler().shared.situation

或通过显式添加!

let situation = SituationHandler().shared.situation!

在旁注中,请注意:

SituationHandler().shared.situation

没有任何意义。 shared始终是一个新实例。要拥有一个单身人士,您需要:

class SituationHandler {
   var situation: Situation!
   static let shared = SituationHandler()
}

然后:

SituationHandler.shared.situation

我也建议您使用默认值而不是IUO:

class SituationHandler {
    var situation: Situation = .bad
    static let shared = SituationHandler()
}

答案 1 :(得分:0)

将隐式解开的可选内容视为可被类型系统强制转换为非可选内容的可选内容。它们仍然是可选的核心。您的代码段不向类型系统提供任何指示,表明您实际上需要非可选值。您可以显式解包,也可以使用类型推断来获取解包的值。请注意,这两种方法都会导致不安全的解包(并且如果在其下有一个nil值,它将仍然崩溃)。

struct SomeObject {

    let iuo: Int! = 3

}

let value1 = SomeObject().iuo
print(type(of: value1)) // Optional<Int>

let value2: Int = SomeObject().iuo
print(type(of: value2)) // Int

let value3 = SomeObject().iuo!
print(type(of: value3)) // Int