- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我不知道我是不是太累了,但我认为还有更多原因。 (试了两杯咖啡,还是没能解决问题。。。)
我想从外部将变量设置为只读,但通过方法可写。 (就像在那个例子中一样,我可以确保 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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!