目前,尝试运行下面的代码时,我收到以下错误: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作为隐式无包装可选的情况下,我不应该没有收到这样的抱怨?我究竟做错了什么?
感谢您的帮助大家谁回答了这个。
隐展开自选还是选配。如果他们能正常使用了自选,他们会。
您可以强制通过声明一个非可选类型简单地展开:
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()
}
想想隐含展开自选作为选配,可以通过类型系统被强制进入非自选的。他们仍然在为核心,选配。您的代码段不给类型系统,你真正想要的非可选值的任何指示。你可以明确地拆开包装,或使用类型推断,得到展开的价值。请注意,这样会导致不安全的展开是(如果你有下有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