En Swift, los niveles de acceso (private, fileprivate, internal, public, open) afectan no solo a las clases, estructuras y sus propiedades, sino también a los tipos anidados. Un tipo anidado hereda por defecto el nivel de acceso de su tipo contenedor, a menos que se especifique una restricción explícita diferente.
Principales matices:
internal, el tipo anidado no puede ser más abierto que el externo, pero puede ser más "cerrado" (por ejemplo, el externo es public, el anidado es private).internal no serán visibles desde otros módulos.Ejemplo:
public class A { public struct B { fileprivate func foo() {} } }
En este ejemplo, A y B son públicos, pero el método foo() es privado de archivo.
Pregunta: "¿Puede un tipo anidado tener un nivel de acceso más alto que el tipo que lo rodea?"
Respuesta: No, el nivel de acceso de un tipo anidado no puede superar el nivel de acceso de su tipo contenedor. Si se intenta declarar un tipo anidado con un nivel de acceso más alto, el compilador generará un error.
Ejemplo de error:
internal struct MyStruct { public enum MyEnum { ... } // Error: public no puede estar dentro de internal }
Historia 1
En un framework general, los niveles de acceso de las estructuras anidadas no estaban sincronizados con los tipos externos. En la versión de lanzamiento, esto llevó a la imposibilidad de utilizar enums internos en la aplicación cliente, y se necesitó un cambio urgente en la interfaz.
Historia 2
En un gran proyecto, un objeto de servicio interno tenía una clase anidada con estados, declarada como internal. Tras la aparición de un nuevo módulo que dependía de esta clase, la integración resultó imposible sin elevar el nivel de acceso y recompilar completamente el SDK.
Historia 3
En una biblioteca compleja, parte de las estructuras anidadas se declararon como public, mientras que el contenedor mismo era internal. Durante la migración a una nueva versión, ocurrieron errores críticos: los tipos públicos no se compilaban en un contexto externo, lo que bloqueó la actualización de varios equipos.