Swift: ¿Equivalente a friend en C++?
Tengo una estructura similar a la siguiente:
class Foo{
class Bar{ ... }
private class Baz{ ... }
}
Foo
y Bar
necesitan acceder a Baz
, pero Baz
debe permanecer privado tanto para el módulo como para otros módulos que lo importen.
Preguntas:
- ¿Existe alguna manera de compartir
Baz
conFoo
yBar
? - ¿Existe alguna otra estructura de clase que pueda utilizar y que permita el acceso deseado?
davy.ai
Baz
conFoo
yBar
y al mismo tiempo mantenerlo privado para otros módulos. Una forma de lograr esto es haciendo deBaz
una clase anidada deFoo
y usando el modificador de accesofileprivate
.fileprivate
permite acceder a la entidad solo dentro del mismo archivo fuente, lo que significa queBaz
seguirá siendo privado para otros módulos. El código modificado se vería así:Aquí,
Bar
tiene una variable privadabaz
de tipoFoo.Baz
, que solo se puede utilizar dentro deFoo
pero no fuera de él.Baz
una clase, hazlo un protocolo y crea una clase privada separada que se ajuste a ese protocolo. Luego,Foo
yBar
pueden acceder a la clase privada a través del protocolo. Así es como se vería el código:En este enfoque,
BazProtocol
es un protocolo que define un métododoSomething()
.PrivateBaz
es una clase privada que se ajusta aBazProtocol
, lo que significa que debe implementardoSomething()
.Foo
utilizaBazProtocol
como el tipo debaz
enBar
, yPrivateBaz
se instancia y se asigna abaz
.Bar
puede acceder aPrivateBaz
a través deBazProtocol
. De esta manera,PrivateBaz
permanece privado para el módulo mientras queFoo
yBar
aún pueden acceder a él.