我无法理解如何使用可选变量。我是否必须在所有代码中检查nil以防止崩溃?例如,使用此代码
let pubHead = "Publisher: "
if let pubName : String? = self.book?.publisher {
self.publisherLabel?.text = pubHead+pubName!
}
book.publisher变量是可选的,所以它可能是也可能不是nil,当它不是nil时,这段代码完全正常,字符串被追加并设置为标签的文本。但是当它为零时我得到了致命的错误。我是否真的需要在我的所有代码中检查nil,以防止类似情况下的崩溃。如果是这样,检查零的正确方法是什么?
答案 0 :(得分:0)
为了解释您看到的错误,if let
结构具有以下语法
if let (x: Type) = (expression of Type?)
这意味着如果您想检查String?
是否为nil
,左侧会有String
(左侧不再是可选的)。
但是,如果您在左侧写下String?
,则右侧的表达式会被推断为String??
。
换句话说,self.book?.publisher
的类型为String?
(Optional<String>
),但会将其放入:
if let pubName : String? = self.book?.publisher {
它将变为String??
(Optional<Optional<String>>
)。
if let
然后正确删除了一个级别的可选项,您将获得String?
。
显然,你想要的是
if let pubname: String = self.book?.publisher
或者推断出类型
if let pubname = self.book?.publisher