swift class swift3 encapsulation

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.