Perché abbiamo la riga '@interface ViewController' nel file di implementazione e di intestazione per un viewcontroller in xcode?Motivo per '@ interface ViewController' sia nell'implementazione che nel file di intestazione per un controller di vista
risposta
Ha a che fare con la visibilità dei contenuti di @interface
. Quando è contenuto nel file di intestazione, è disponibile per altre classi da vedere quando importano il file di intestazione. Quando è contenuto nel file di implementazione, i contenuti sono disponibili solo per quel file di implementazione. In genere, quando viene dichiarato all'interno del file di implementazione, viene eseguito tramite un'estensione di classe (ad esempio @interface ClassName()
, lo ()
denota un'estensione di classe/categoria anonima), sebbene sia possibile utilizzare una categoria denominata, se lo si desidera.
Ci sono alcuni motivi per cui questo è stato fatto. Il principale è definire variabili o proprietà di istanze private. Non vuoi che siano esposti a tutti coloro che importano il file di intestazione, ma hai bisogno di un posto dove archiviare le informazioni interne. Ad esempio, questo permetterà m_isActive
da utilizzare all'interno solo l'attuazione:
@interface Class() {
BOOL m_isActive;
}
È inoltre possibile ignorare le proprietà di sola lettura dichiarate nel file di intestazione, in modo che il file di implementazione ha readwrite
accesso ad essa quando si utilizza la notazione punto. Per esempio:
Intestazione:
@interface Class
@property (nonatomic, readonly) NSString* name;
@end
Implementazione:
@interface Class()
@property (nonatomic) NSString* name;
@end
@implementation Class
...
self.name = @"WDUK"; // This is allowed, as the class extension has overridden the readonly attribute via a redeclaration of the property
...
@end
Un altro uso popolare è quello di dichiarare in privato che si conformi a particolari protocolli, che è un dettaglio di implementazione e non ha bisogno di essere esposto all'interno del file di intestazione pubblico. Ad esempio, quando l'implementazione utilizza un oggetto che richiede che sia un delegato e non si desidera inquinare il file di intestazione con un protocollo che non viene utilizzato al di fuori della classe.
Altri usi (che sono stati lasciati al buio con i recenti miglioramenti di LLVM/Clang) dovevano definire metodi privati. Questo non è più necessario, poiché il compilatore cercherà i metodi non dichiarati all'interno del rispettivo file di intestazione e assumerà che siano privati della classe e li dichiarino da soli.
La parte fondamentale di prendere da tutto questo, è che qualsiasi cosa all'interno @interface
all'interno del file di intestazione (tranne le variabili d'istanza definite c'è via @private
o @protected
) sono pubbliche, e qualsiasi cosa all'interno del file di implementazione è intrinsecamente privata.
Quello nel file di intestazione definisce l'interfaccia pubblica.
Quello nel file di implementazione è un'estensione di classe che estende l'interfaccia pubblica a qualsiasi dettaglio di implementazione privato.
- 1. Come creare un evento per UIButton in ViewController?
- 2. Classe sconosciuta nel file di Interface Builder
- 3. Come verificare che un file sia caricato in un controller?
- 4. Configurazione di ibernazione sia nel file che nel codice
- 5. C++: motivo per cui utilizzare ".hh" come estensione per i file di intestazione C++
- 6. Devo usare lo stesso dettaglio ViewController per lavorare sia a livello modale che quando viene premuto?
- 7. Un controller MVC di Spring può restituire sia un HttpServletResponse che una vista?
- 8. newbie che cerca di capire più @interface nel file .h
- 9. Come copiare o duplicare un ViewController in Interface Builder?
- 10. Come passare da un controller di visualizzazione a un altro controller di vista
- 11. Classe sconosciuta FBSDKLoginButton nel file Interface Builder
- 12. StoryBoard gestione ereditaria controller vista
- 13. Intestazione per file sorgente
- 14. Ottenere riferimento per visualizzare il controller della vista contenitore
- 15. Per visualizzare HeadView con immagini ed etichette nel viewcontroller
- 16. Motivo per "{return 0;}" o "{;}" nel file .h della libreria
- 17. Come aggiungere un controller di navigazione con Interface Builder?
- 18. Legatura chiave per "Nuova vista nel file"
- 19. Presentazione di un ViewController su un file xib in SWIFT
- 20. Collegamento di un nuovo viewcontroller a Storyboard?
- 21. Come posso implementare "trascina verso destra per eliminare" un controller di vista che si trova in uno stack di navigazione?
- 22. Creazione di una barra delle linguette per ViewController
- 23. Spingere un altro controller di visualizzazione in una vista UITabBarController
- 24. Nessun @interface visibile per
- 25. Ricaricamento di un ViewController
- 26. Cos'è il file ViewController.swift (Interface) per - in Counter
- 27. Scrittura di un file .CSV in Python che funziona sia per Python 2.7+ che per Python 3.3+ in Windows
- 28. non autorevole-Motivo campo di intestazione [HTTP]
- 29. Posso avere sia un controller che un ApiController per la stessa cosa?
- 30. Classe sconosciuta **** nel file Interface Builder
Un altro utilizzo dell'estensione di classe consiste nel dichiarare privatamente che la classe è conforme a uno o più protocolli. – rmaddy
Picchiami al punch, lo aggiungevo già! Ottimo punto però. – WDUK
Quali sono questi protocolli di cui voi ragazzi state parlando? –