在Swift指南https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html中 有一个使用隐式展开的可选内容的示例
class Country {
let name: String
var capitalCity: City!
init(name: String, capitalName: String) {
self.name = name
self.capitalCity = City(name: capitalName, country: self)
}
}
class City {
let name: String
unowned let country: Country
init(name: String, country: Country) {
self.name = name
self.country = country
}
}
我想知道是否有可能,如果做些小改动会带来什么变化:
var capitalCity: City = nil
答案 0 :(得分:3)
您的代码将无法编译。这就是为什么。
通过指定var capitalCity: City
,您明确表示变量是非可选。它只能容纳有效的City
。它永远不能是可选的,因此它永远不能容纳nil
。
同时,您每次使用?
或!
时,都在定义一个可选类型。这些可以为零,实际上默认情况下为nil
。
因此,在您的指南示例中,var capitalCity: City!
表示以下内容:
capitalCity
被声明为隐式解包的可选类型(!
),这意味着作为开发人员的您声明其始终具有有效的{{ 1}},只要调用它就输入。 City
之前,它默认为City
。何时应该使用可选选项取决于您要如何使用属性。在原始示例中,从我们很少看到的情况来看,nil
仅在类init中设置。因此,没有理由要它是可选的。因此,对于该示例,它可以像其他属性一样存在:capitalCity
。
很大程度上取决于您在使用对象时希望属性如何存在和工作。例如,使某项为可选项至少表明两件事:
let capitalCity: City
)我希望这可以帮助您更多地了解可选内容。