2014-10-14 19 views
6

sto lavorando sulla costruzione di una nuova applicazione Swift o meno in base al largo un vecchio Obj-C app. Attualmente sto lavorando a dei delegatiScopo del file? Swift delegati e protocolli

Ecco quello che il mio codice obj-c sembrava nel file .h

@interface MyAppViewController : CustomViewController 
@property (nonatomic, weak) id<MyAppViewControllerDelegate> delegate; 
@end 

@protocol MyAppViewControllerDelegate <NSObject> 
- (void)myAppViewController:(MyAppViewController *)controller loggedInStudent: (MYStudent *)student; 
- (void)myAppViewControllerWantsSignUp:(MyAppViewController *)controller; 
@end 

In SWIFT ho fatto:

class MyAppViewController: CustomViewController { 

var delegate: MyAppViewControllerDelegate? 
protocol MyAppViewControllerDelegate{ 
func myAppViewController(controller: MyAppViewController, loggedInStudent:  MYStudent) 
func myAppViewControllerWantsSignUp(controller: MyAppViewController) 

che ho fatto un sacco di lettura e studio su questo, quindi ho pensato che lo stavo facendo fondamentalmente giusto (totalmente nuovo per swift però ... quindi)

Sto ricevendo questo errore però, "Declaration is only valid in file scope" su protocol MyAppViewControllerDelegate { Ho assunto questo aveva qualcosa a che fare con dichiarandolo all'interno della classe, così ho spostato fuori, solo ora il mio codice all'interno della classe non riconosce la variabile delegato ho dichiarato ..

Tutte le idee?

risposta

6

dovrebbe essere questo:

protocol MyAppViewControllerDelegate { 
    func myAppViewController(controller: MyAppViewController, loggedInStudent:  MYStudent) 
    func myAppViewControllerWantsSignUp(controller: MyAppViewController) 
} 

class MyAppViewController: CustomViewController { 

    var delegate: MyAppViewControllerDelegate? 
} 

Anche se, se stai seguendo un modello comune in cui l'oggetto che possiede MyAppViewController è anche il suo delegato, ciò può causare problemi di memoria. È possibile utilizzare class digitazione per consentire la delega deboli in questo modo:

protocol MyAppViewControllerDelegate : class { 
    func myAppViewController(controller: MyAppViewController, loggedInStudent:  MYStudent) 
    func myAppViewControllerWantsSignUp(controller: MyAppViewController) 
} 

class MyAppViewController: CustomViewController { 

    weak var delegate: MyAppViewControllerDelegate? 
} 

Questo è un po 'limitante, perché richiede l'uso di una classe per il delegato, ma aiuterà evitare di mantenere i cicli :)

2

Da quello che vedo nel codice sorgente è che hai dichiarato il protocollo all'interno della classe. Basta dichiarare il protocollo di fuori della dichiarazione di classe e non avrete problemi.

Aggiornamento:

Il livello di accesso di default è impostato su interno che è definito come

accesso interno consente entità da utilizzare all'interno di qualsiasi file di origine dal loro modulo che definisca,> ma non in qualsiasi file sorgente al di fuori di quel modulo. Di solito si utilizza l'accesso interno quando> la definizione di un app o la struttura interna di un quadro.

Al contrario di Objective-C o C non è necessaria una dichiarazione di inoltro se l'implementazione non è avvenuta prima dell'utilizzo.

Fonte: The Swift Programming Language, Access Control

Problemi correlati