Cómo declarar una variable ''protegida'' en swift
class swift3 (2)
Incluso si Swift no proporciona acceso protected
, aún podemos lograr un acceso similar mediante el uso del control de acceso fileprivate
.
Lo único que debemos tener en cuenta es que debemos declarar a todos los hijos en el mismo archivo que el padre declaró.
Cambio de animales
import Foundation
class Animal {
fileprivate var protectedVar: Int = 0
}
class Dog: Animal {
func doSomething() {
protectedVar = 1
}
}
OtroFile.swift
let dog = Dog()
dog.doSomething()
Quiero crear una clase que herede de otra clase, que está en un archivo diferente.
Por ejemplo:
Class1.swift
class Class1
{
protected var
//Do Stuff
}
Class2.swift
class Class2:Class1
{
//Do stuff
}
¿Cómo sería posible tener acceso a una variable / función protegida en Swift?
Cuando declaro una variable / función privada, solo puedo usarla en esa clase. Si uso ''fileprivate'', mi otra clase DEBE estar en el archivo de guardar como Class1. Lo que quiero hacer es mantener mis clases en archivos separados y usar los Grupos desde Xcode para saber qué clase pertenece a qué categoría.
Tendría que usar internal
para eso, ya que Swift no ofrece una palabra clave protected
(a diferencia de muchos otros lenguajes de programación). internal
es el único modificador de acceso entre fileprivate
y public
:
El acceso interno permite que las entidades se usen dentro de cualquier archivo fuente desde su módulo de definición, pero no en ningún archivo fuente fuera de ese módulo. Normalmente, se utiliza el acceso interno al definir una estructura interna de una aplicación o de un marco.
Hay una publicación en el blog que explica un poco más sobre por qué los diseñadores de idiomas optaron por no ofrecer una palabra clave protected
(o algo equivalente).
Algunas de las razones son que
En realidad, no ofrece ninguna protección real, ya que una subclase siempre puede exponer la API "protegida" a través de un nuevo método o propiedad pública.
y también el hecho de que protected
causaría problemas cuando se trata de extensiones, ya que no estaría claro si las extensiones también deberían tener acceso a propiedades protected
o no.