En Swift, ¿cuál es la forma convencional de definir el patrón común en el que una propiedad debe ser externamente de solo lectura, pero modificable internamente por la clase (y subclases) que la poseen?
En Objective-C, existen las siguientes opciones:
- Declare la propiedad como de solo lectura en la interfaz y use una extensión de clase para acceder a la propiedad internamente. Este es un acceso basado en mensajes, por lo que funciona bien con KVO, atomicity, etc.
- Declare la propiedad como de solo lectura en la interfaz, pero acceda al ivar de respaldo internamente. Como el acceso predeterminado para un ivar está protegido, esto funciona bien en una jerarquía de clases, donde las subclases también podrán modificar el valor, pero el campo es de solo lectura.
En Java, la convención es:
- Declare un campo protegido e implemente un getter (método) público de solo lectura.
¿Cuál es el modismo de Swift?
fuente
var
palabra clave que falta para que se compile).public
; debería serlointernal
o nada en absoluto (que por defecto es la clase que sea,public
ointernal
), es decirprivate(set) var readonlyProperty: Int
private
ahora se restringe a la declaración actual (no al archivo) yfileprivate
está disponible para restringir al archivo actual. Tambiénpublic
tiene algunas restricciones yopen
es necesario para no tener restricciones. Detalles aquí .Según @Antonio, podemos usar una sola propiedad para acceder como
readOnly
valor de la propiedad de forma pública yreadWrite
privada. A continuación se muestra mi ilustración:Y aquí está la salida:
fuente