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
,而不是代码中KeyPath
的ReferenceWritableKeyPath
子类。与let
常量一样,不能使用KeyPath
类设置值。