用nil和隐式解包的可选变量初始化变量

时间:2019-11-11 16:52:13

标签: swift

在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 

1 个答案:

答案 0 :(得分:3)

您的代码将无法编译。这就是为什么。

通过指定var capitalCity: City,您明确表示变量是非可选。它只能容纳有效的City。它永远不能是可选的,因此它永远不能容纳nil

同时,您每次使用?!时,都在定义一个可选类型。这些可以为零,实际上默认情况下为nil

因此,在您的指南示例中,var capitalCity: City!表示以下内容:

  • capitalCity被声明为隐式解包的可选类型(!),这意味着作为开发人员的您声明其始终具有有效的{{ 1}},只要调用它就输入。
  • 也就是说,在您为其设置City之前,它默认为City

何时应该使用可选选项取决于您要如何使用属性。在原始示例中,从我们很少看到的情况来看,nil仅在类init中设置。因此,没有理由要它是可选的。因此,对于该示例,它可以像其他属性一样存在:capitalCity

很大程度上取决于您在使用对象时希望属性如何存在和工作。例如,使某项为可选项至少表明两件事:

  1. 该属性在类的生命周期中可能没有有效的值。
  2. 初始化课程时,可能没有设置它。 (请记住,一个可选的初始化为let capitalCity: City

我希望这可以帮助您更多地了解可选内容。