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"Hice a jenna con la palabra clave 'let', pero si uso keyPath, podría cambiar la propiedad de jenna. ¿Cómo funciona?
KeyPaths son irrelevantes.
Hiciste la variable Person.name . Como tal, mac.owner.name = "jerry" funciona bien.
Pero no lo hará si cambias el name a let . Eso hará que ownerKeyPath sea un KeyPath , no la subclase ReferenceWritableKeyPath de KeyPath que está en su código. Al igual que con las constantes let , no puede establecer valores usando la clase KeyPath .
Person es un tipo de referencia (una clase). Para un tipo de referencia, let solo significa que la referencia en sí no puede cambiar, por lo que no se puede hacer que jenna apunte a otro objeto. Pero puede cambiar cualquier propiedad var dentro de él (como name . KeyPaths no está relacionado aquí. Lo mismo ocurre con el acceso a la propiedad normal:
mac.owner.name = "jerry" Si desea que Person se comporte como un valor, de modo que sus propiedades no puedan cambiar cuando se marca con let (pero sí cuando se marca con var ), entonces debe ser una estructura, no una clase. Entonces se comportará como Stuff.