gpt4 book ai didi

swift - 具有 private(set) 的结构类型的默认成员初始化器

转载 作者:行者123 更新时间:2023-11-30 11:40:49 27 4
gpt4 key购买 nike

为什么 Swift 4 允许我们修改“默认成员初始化器”中的 private(set) 变量?这是一个错误还是一个功能?更重要的是,避免这种情况并保持 private(set) 相同功能的最简单方法是什么?

示例代码:

import Foundation

struct MyStruct {
private(set) var counter = 0
}

let myStruct = MyStruct(counter: 5) //Should not be allowed in my opinion
print(myStruct.counter) //Returns 5

最佳答案

初始化时的规则与任何其他时间都不同,因为有必要将所有属性初始化为初始化的一部分。这就是为什么即使没有值的 let 属性也可以在初始化器中被赋予一个值;这是唯一一次let常量可以被其他代码赋值。因此这是合法的:

struct MyStruct {
let counter : Int
init(counter:Int) { self.counter = counter } // ok to assign to `let`
}

请记住,提供的成员初始化程序只是一个与其他初始化程序一样的初始化程序。你可以明确地写出来。假设你写的是:

struct MyStruct {
private(set) var counter : Int
init(counter:Int) { self.counter = counter }
}
let myStruct = MyStruct(counter: 5)

我想,你不否认有道理吗?现在 counter 声明中没有默认初始化,因此为其提供初始值的唯一方法是初始化程序。这也是必要的,因为我们必须在对象初始化过程中初始化所有属性。

嗯,你的代码没有明显不同。您确实提供了默认初始化,但成员初始化程序仍然是初始化程序,并且允许为属性提供值。

如果您的目标是在提供初始值后完全无法更改 counter 的值,那么它应该是 let 常量,而不是 var 变量。

如果您的目标是使初始化程序 MyStruct 具有或不具有显式计数器的合法性,那么您可以这样编写相同的内容:

struct MyStruct {
private(set) var counter : Int
init(counter:Int = 0) { self.counter = counter }
}

关于swift - 具有 private(set) 的结构类型的默认成员初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49307718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com