Swift 使用nil和隐式展开选项初始化变量

Swift 使用nil和隐式展开选项初始化变量,swift,Swift,迅速引导 有一个使用隐式展开选项的示例 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

迅速引导 有一个使用隐式展开选项的示例

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 

您的代码将无法编译。原因如下

通过指定var capitalCity:City,您明确表示您的变量是非可选的。它只能持有一个有效的城市。它永远不可能是可选的,因此它永远不能保持零

同时,你什么时候用?或您正在定义一个可选类型。这些可以是零,实际上默认情况下是零

因此,在指南中的示例中,var capitalCity:City!他说的是:

capitalCity声明为隐式展开的可选类型!,这意味着,作为开发人员,无论何时调用它,都要声明它始终具有有效的城市类型。 也就是说,在设置城市之前,它默认为零。 什么时候应该使用optionals取决于您希望如何使用您的属性。在最初的示例中,我们很少看到,capitalCity仅在类init中设置。所以没有理由让它成为可选的。例如,它可以像其他属性一样存在:let capitalCity:City

很大程度上取决于使用对象时希望属性如何存在和工作。例如,使某件事情成为可选的至少意味着两件事:

该属性在类的生命周期中可能没有有效值。 初始化类时可能没有设置它。记住,一个可选的初始化为nil
我希望这有助于你更多地理解optionals

这个小小的改变不会被编译。你应该提到,根本没有理由让capitalCity成为可选的,因为它在初始值设定项中被正确初始化为非nil值。在这种情况下,我同意。我直接回答了他的问题,关于指南中的内容和他想做的有什么区别。不过我可以记下来。谢谢,@rmaddy。没错,谢谢!但我想我的意思其实是var capitalCity:城市?=nil@rmaddy之所以选择它,是因为我认为City的初始值设定项是从Country的初始值设定项中调用的。但是,在新的国家/地区实例完全完成之前,国家/地区的初始值设定项不能将self传递给城市初始值设定项initialized@EasySkankin我确实忽略了这样一个事实,即你需要将self传递给乡下的城市初始值设定项。这确实改变了一切。