Soy bastante nuevo en Swift, y aunque he leído la documentación de Apple y muchos temas e hilos sobre esto, todavía no puedo entender cuál es la diferencia entre { get } y { get set } . Quiero decir, estoy buscando una explicación con un ejemplo concreto.
Como por ejemplo:
protocol PersonProtocol { var firstName: String { get } var lastName: String { get set } }¿Cuál sería la diferencia real entre estas dos propiedades? Traté de jugar con estas propiedades en un parque infantil:
struct Person: PersonProtocol { var firstName: String var lastName: String } var p = Person(firstName: "John", lastName: "Lennon") print(p.firstName) // John print(p.lastName) // Lennon p.firstName = "Paul" p.lastName = "McCartney" print(p.firstName) // Paul print(p.lastName) // McCartneyNo ayudó... Gracias por tu ayuda.
Está creando una variable de tipo Person y no hay restricciones en esa estructura. Si, en cambio, crea una variable de tipo PersonProtocol , firstName será de solo lectura.
var p1: PersonProtocol = Person(firstName: "John", lastName: "Lennon") print(p1.firstName) // John print(p1.lastName) // Lennon p1.firstName = "Paul" <== error: cannot assign to property: 'firstName' is a get-only propertyprotocol : es un requisito de alguna interfaz mínima del tipo que lo implementa.
var name: Type { get } requiere que el tipo tenga una propiedad con al menos un getter (accesible desde fuera del tipo, no private ), es decir, el código externo debería poder leer el valor de la propiedad. En el tipo de implementación, se podría let name: Type , var name: Type , private(set) var name: Type , fileprivate(set) var name: Type , etc.
var name: Type { get set } requiere que el tipo tenga una propiedad con getter y setter accesibles, es decir, el código externo debería poder leer y escribir en la propiedad. Aquí solo se permitiría var name: Type .
Si el protocol requiere getter pero también proporciona un setter , no está en contra de los requisitos del protocol . Pero si el protocol requiere tanto getter como setter , debe proporcionar ambos, y no tener ninguno de ellos no será una implementación válida.
Su clase Person definió ambas propiedades como var (con getter y setter accesibles), por lo tanto, puede cambiarlas. Pero PersonProtocol no ha requerido la capacidad de establecer firstName .
Y como muestra firstName , si solo usa la interfaz requerida por el protocol , no podrá cambiar el valor del nombre.