gpt4 book ai didi

ios - private(set) raises 'self' 在结构中是不可变的

转载 作者:搜寻专家 更新时间:2023-10-31 22:01:20 25 4
gpt4 key购买 nike

我不知道我是不是太累了,但我认为还有更多原因。 (试了两杯咖啡,还是没能解决问题。。。)

我想从外部将变量设置为只读,但通过方法可写。 (就像在那个例子中一样,我可以确保 favoriteNumber 只是个位数。

(我不想让它成为计算属性并在 get {}、set{} 中执行此操作,因为在我的其他项目中我想根据不同于 set { 的“newValue”的值修改变量})

struct Person {

var name: String
private(set) var favoriteNumber: Int? // Should only be single-digit

init(name: String, number: Int) {

self.name = name

// Make sure favorite number is single-digit
guard number >= 0 && number < 10 else {
self.favoriteNumber = nil
}
self.favoriteNumber = number
}

func changeFavoriteNumber(number: Int) {
guard number >= 0 && number < 10 else { return }
self.favoriteNumber = number
}
}

.

线

self.favoriteNumber = number 

在函数中

changeFavoriteNumber(number:)

引发错误

"Cannot assign to property: 'self' is immutable"

并建议“将方法标记为'mutating'以使'self'可变”。但这不是我想要的,因为我不想修改 Person 类型的实例,而是修改一个可变变量... (var favoriteNumber)

应该以这种方式使用:

let frank = Person.init(name: "Frank", number: 9)
frank.changeFavoriteNumber(number: 8)

我不知道这里发生了什么(即使现在已经喝了 3 杯咖啡了 :)

最佳答案

结构是值类型,与类具有不同的语义。存储类实例的变量作为对内存中其他地方的实际对象的引用存储;这意味着您可以让两个变量指向同一个对象,并且您可以修改一个类的成员,无论引用它的变量是否可变。

结构不同。存储 struct 实例的变量直接存储结构的成员,而不是作为对其他地方对象的引用。这意味着将结构传递给函数或另一个变量会创建它的副本,而修改 struct 会直接修改存储它的变量。

因此,结构是不可变的,除非它存储在 var 中。改变结构的函数必须按照编译器的建议声明为 mutating,这样编译器就可以强制在 let 结构上只调用非改变函数。

关于ios - private(set) raises 'self' 在结构中是不可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48754367/

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