具有私有(集)的结构类型的默认成员初始值设定项

时间:2018-03-15 19:25:08

标签: swift struct initialization structure private

为什么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

1 个答案:

答案 0 :(得分:0)

初始化时的规则与任何其他时间的规则不同,因为必须在初始化时初始化所有属性。这就是为什么即使没有值的let属性也可以在初始值设定项中给出一个值;这是唯一的时间,其他代码可以为let常量分配。因此,这是合法的:

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

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

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

我想,你不否认 有意义吗?现在counter声明中没有默认初始化,因此 only 赋予初始值的方式将是初始值。这也是必需的,因为我们必须将所有属性初始化为对象初始化的一部分。

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

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

如果您的目标是在使用或不使用明确counter的情况下使初始化MyStruct合法,那么您可以用这种方式编写相同的内容:

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