隐无包装可选枚举投诉

问题描述 投票:1回答:2

目前,尝试运行下面的代码时,我收到以下错误: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")
        }

    }
}

如果我使用的SituationHandler作为隐式无包装可选的情况下,我不应该没有收到这样的抱怨?我究竟做错了什么?

感谢您的帮助大家谁回答了这个。

swift enums optional
2个回答
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()
}

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
© www.soinside.com 2019 - 2024. All rights reserved.