gpt4 book ai didi

swift - Swift 中的只读可变字段

转载 作者:行者123 更新时间:2023-11-28 12:28:47 25 4
gpt4 key购买 nike

在 Swift 中定义一个类时,您可以拥有类似于其他 OOP 语言中的普通字段的 var 属性,也可以拥有既是只读的又是 let 的属性不可变(如 C++ 中的 T const * const)。

然而,是否存在与 C++ 的 T * const 等效的 Swift? (即字段本身是不可变的,但它指向的对象是可变的)?

这是我的场景的表示:

class Foo {
let bar: Bar
init(bar: Bar) {
self.bar = bar
}
}

protocol Bar {
var fleem: Int? { get set }
}

class ConcreteBar : Bar {
var fleem: Int? = nil
}

var foo: Foo = Foo( bar: ConcreteBar() )
foo.bar.fleem = 123

( Playground 链接:https://iswift.org/playground?3jKAiu&v=2)

目前这给了我这个编译器错误:

Swift:: Error: cannot assign to property: 'bar' is a 'let' constant`
foo.bar.fleem = 123

请注意,我实际上并没有设置 bar,我只是设置了 bar.fleem。我不知道为什么编译器会提示分配给 bar

如果我更改 Foo 以使用它:

class Foo {
var bar: Bar
// ...

...然后它编译正常,但是我失去了 Foo.bar 始终具有相同实例的保证。

我知道我也可以将其更改为private(set):

class Foo {

public private(set) var bar: Bar
// ...

...但是 Foo 本身仍然可以自由覆盖 bar 对象引用,并且 var 的使用意味着编译器也不能假定引用是不可变的,因此可以跳过一些优化。

我正在寻找类似于假设的 let mutablevar readonly 关键字或修饰符的东西。

最佳答案

默认情况下,协议(protocol)类型对象具有值语义。因此,如果变量是 let 常量,它们是不可变的。

要引入引用语义(通过扩展,对象的可变性被称为 let 常量),您需要将您的协议(protocol)变成类协议(protocol):

protocol Bar: class {
var fleem: Int? { get set }
}

关于swift - Swift 中的只读可变字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42687096/

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