在 Swift 中,如果我用 'let' 做一些东西,我就不能改变属性,但为什么 keyPath 不同?


class Person{
var name: String
init(_ name: String){
self.name = name
}
}
struct Stuff{
var name: String
var owner: Person1
}
let jenna = Person("jenna")
var mac = Stuff(name: "Macbook pro", owner: jenna)
let ownerKeyPath = Stuff.owner.name
mac[keyPath: ownerKeyPath] = "jerry"     

我用"let"关键字制作了jenna,但如果我使用keyPath,我可以更改jenna的属性。它是如何工作的?

Person是一个引用类型(类(。对于引用类型,let只是意味着引用本身不能更改,因此不能使jenna指向另一个对象。但是您可以更改其中的任何var属性(例如name。KeyPaths在这里不相关。常规属性访问也是如此:

mac.owner.name = "jerry"

如果您希望Person的行为像一个值,这样当它被标记为let时,它的属性就不会改变(但当它被标为var时可以改变(,那么它需要是一个结构,而不是一个类。然后它会表现得像Stuff。

KeyPaths是不相关的。

您使Person.name变为变量。因此,mac.owner.name = "jerry"运行良好。

但如果将name更改为let,则不会。这将使ownerKeyPath成为KeyPath,而不是代码中KeyPathReferenceWritableKeyPath子类。与let常量一样,不能使用KeyPath类设置值。

最新更新