我正在学习learn-swift playground,并在学习该语言时将其升级为Swift 2.0.下面的代码(可能与以前版本的Swift一起使用)现在生成了两个错误:"在初始化所有存储属性之前使用"self"和"在初始化之前使用常量"self.capitalCity"

class Country
{
    let name: String
    let 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
    }
}

阅读answer to a similar question,我发现我可以将let capitalCity: City!改为var capitalCity: City!,语法错误得到解决.

我意识到,在这个人为的例子中,一个国家的首都可以改变,所以这很好,但如果有一个 case ,其中的价值真的是一个常数...

有没有办法在保持capitalCity不变的情况下解决语法错误?

推荐答案

在这种情况下,我建议您将属性设置为变量,但通过计算(computed)属性隐藏它(使其看起来像常数):

class Country {
    let name: String

    private var _capitalCity: City!
    var capitalCity: City {
        return _capitalCity
    }

    init(name: String, capitalName: String) {
        self.name = name
        self._capitalCity = City(name: capitalName, country: self)
    }
}

Swift相关问答推荐

动画过程中的SwiftUI重绘视图

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

如何在每天午夜重置布尔值

了解SWIFT中的命名VS位置函数调用

将matchedGeometryEffect 应用于列表视图内的视图时,列表视图中的项目会受到影响 - SwiftUI

如何绑定环境变量ios17

如何使用模型在 SwiftUI 的列表中进行搜索

在Swift中如何将NSUrl转换为本地路径URL

如何制作具有 2 个视图的 3D 旋转动画?

如何从另一个 swift 文件中调用函数

如何在 SwiftUI 中将图像传递到 2 个视图

swiftui更改显示的 Select 器值

如何将回调传递给 View init

无法使用锚激活约束

Swift:创建 UIImage 数组

如何发送静默推送通知有效负载

<<错误类型>> 奇怪的错误

SwiftUI:将多个 BindableObjects 放入环境

键盘显示时Tableview滚动内容

我可以让#selector 引用 Swift 中的闭包吗?