In Swift, i livelli di accesso (private, fileprivate, internal, public, open) influenzano non solo le classi, le strutture e le loro proprietà, ma anche i tipi annidati. Un tipo annidato per impostazione predefinita eredita il livello di accesso del tipo circostante, a meno che non venga specificata un'altra restrizione esplicita.
Principali sfide:
internal, il tipo annidato non può essere più aperto di quello esterno, ma può essere più "chiuso" (ad esempio, esterno — public, annidato — private).internal non saranno visibili da altri moduli.Esempio:
public class A { public struct B { fileprivate func foo() {} } }
In questo esempio, A e B sono pubblici, ma il metodo foo() è privato per il file.
Domanda: "Un tipo annidato può avere un livello di accesso superiore rispetto al tipo che lo circonda?"
Risposta: No, il livello di accesso di un tipo annidato non può superare il livello di accesso del suo tipo circostante. Se si prova a dichiarare un tipo annidato con un livello di accesso più elevato, il compilatore genererà un errore.
Esempio di errore:
internal struct MyStruct { public enum MyEnum { ... } // Errore: public non può essere all'interno di internal }
Storia 1
In un framework generale, i livelli di accesso delle strutture annidate non erano sincronizzati con i tipi esterni. Nella versione di rilascio, questo ha portato all'impossibilità di utilizzare enum interni in un'applicazione client, e sono stati necessari cambiamenti urgenti all'interfaccia.
Storia 2
In un grande progetto, un oggetto di servizio interno aveva una classe annidata di stati, dichiarata come internal. Dopo l'aggiunta di un nuovo modulo che dipendeva da questa classe, l'integrazione è stata impossibile senza aumentare il livello di accesso e una completa ricompilazione dell'SDK.
Storia 3
In una libreria complessa, alcune strutture annidate erano dichiarate come pubbliche, mentre il contenitore stesso era internal. Durante la migrazione a una nuova versione sono emersi errori critici: i tipi pubblici non si compilavano in contesti esterni, bloccando l'aggiornamento di diversi team.