swift - Swift初始化时常量属性的概念

标签 swift properties initialization

“ 对于类实例,常量属性只能由引入它的类在初始化期间修改。它不能被子类修改。” 摘自:Apple Inc.“The Swift Programming Language (Swift 3.1)”。 iBooks。

我很难理解这一点,因为我也可以通过子类修改属性。 下面是代码。

class ConstantTest {
    let constant: String
    init(constant: String) {
        self.constant = constant
    }
    func printConstant() {
        print(constant)
    }
}

let constanttest = ConstantTest(constant: "Hello")
constanttest.printConstant()

class SubConstClass: ConstantTest { }

var subTest = SubConstClass(constant: "hey")
subTest.printConstant()

最佳答案

让您感到困惑的关键是子类初始化常量属性意味着什么。这意味着子类不能引入分配值的初始化程序。让我们考虑一个简单的案例:

class Person {
    let name: String
    init() {
        name = "Alice"
    }
}

这可以通过在其声明中分配 name 来更简单地编写,但我希望这更清楚。现在我们要创建一个子类,将 name 分配给其他东西。执行此操作的明显方法(以及如何在没有常量属性的语言中执行此操作)是在调用 super.init() 之后分配它:

class Employee: Person {
    override init() {
        super.init()
        name = "Bob" // error: cannot assign to property: 'name' is a 'let' constant
    }
}

没有。我们遇到了您摘录中描述的情况。好吧,也许我们应该先分配它?

class Employee: Person {
    override init() {
        name = "Bob" // error: cannot assign to property: 'name' is a 'let' constant
        super.init()
    }
}

没有。没有更好。

啊!这是因为我们调用了 super.init()。让我们不要调用它。

class Employee: Person {
    override init() {
        name = "Bob" // error: cannot assign to property: 'name' is a 'let' constant
    }
}

不...当他们说你不能这样做时,他们的意思是你不能这样做。您可以探索更多,例如将类更改为:

class Person {
    let name = "Alice"
}

你会发现你有所有相同的问题。您不能从子类中引入的方法分配给父类(super class)中的 let 常量。

关于swift - Swift初始化时常量属性的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42796339/

相关文章:

swift - 在 Swift 中将可选字符串转换为可选 Int 的最简单方法

php - 在 Phing(和 Ant)构建脚本中选择属性

PHP - 访问不区分大小写的对象属性?

c - 在 C 中初始化一个零数组

ios - 是否可以在 UIScrollView 中添加 UITableView?

ios - 不使用表情符号键盘调用 UIKeyboardWillChangeFrame 通知

ios - 使用 WebKit 加载 YouTube 视频时控制台中打印警告

c# - 实例化对象的差异 - C# basic

c++ - 如何将初始化的结构放入结构中?

c# - 如何在全局范围内初始化全局嵌套字典?