为什么结构体中的常量属性可以在初始化器中发生变化?

问题描述 投票:0回答:1

我有兴趣了解 Swift 编译器设计背后的原因,即允许在初始化器中为属性赋值,即使它被定义为常量。难道用

let
定义的任何东西都不允许发生变异吗?

示例代码:

struct Exercise {
    let name: String
    
    // works fine (why?)
    init(name: String) {
        self.name = name
    }
    
    // throws error (makes sense)
    mutating func changeName(name: String) {
        self.name = name
    }
}
swift swift-structs
1个回答
0
投票

您没有改变初始化器中的常量。您正在初始化程序中使用常量的初始(且唯一)值来初始化该常量。

这一切都在 Swift 书的初始化章节中介绍。请参阅在初始化期间分配常量属性部分。

另请注意,如果您根本没有提供任何

init
,您的显式
init
只是复制您将收到的结构的默认
init

struct Exercise {
    let name: String
    
    // throws error (makes sense)
    mutating func changeName(name: String) {
        self.name = name
    }
}

let someExercise = Exercise(name: "Some Name")

上面的代码与您问题中的代码相同。如果您注释掉

changeName
中的错误行,那么代码就可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.