2016-03-17 15 views
9

Vorrei nido un protocollo nella mia classe per implementare il modello di delegato in questo modo:Swift protocollo annidato in una classe

class MyViewController : UIViewController { 

    protocol Delegate { 
     func eventHappened() 
    } 

    var delegate:MyViewController.Delegate? 

    private func myFunc() { 
     delegate?.eventHappened() 
    } 
} 

Ma il compilatore non lo permetterà:

dichiarazione è valido solo per lo scope del file

Posso farlo funzionare facilmente dichiarando MyViewControllerDelegate al di fuori dell'ambito della classe.
La mia domanda è perché una tale limitazione?

risposta

9

secondo l'swift documenation

Swift consente di definire tipi nidificati, per cui è nido supporto enumerazioni, classi e strutture nella definizione del tipo supportato.

Dato che i protocolli non sono in tale elenco, non sembra che sia attualmente supportato. È possibile che aggiungano la funzione ad un certo punto, (Swift è stato annunciato meno di 2 anni dopo tutto). Qualche idea sul perché non lo faranno o meno non sarebbe una speculazione da parte mia.

-3

Un problema separato con la classe è che delegate non ha un tipo concreto. Puoi farla franca dichiarandola come MyViewController.Delegate? perché è un tipo facoltativo e può essere .None. Ma questo rende solo il tuo codice privato myFunc guasto. Solo elenchi, classi e strutture possono conformi a in un protocollo. Quale di questi tre tipi è delegate?

Detto questo, questa non è la causa del tuo problema. Quando faccio un tipo reale per delegate e lo faccio conforme al protocollo Delegate, ho ancora lo stesso errore.

class MyViewController: UIViewController { 

    protocol Delegate { 
    func eventHappened() 
    } 

    class Classy: Delegate { 
    func eventHappened() { 
     print("eventHappened") 
    } 
    } 

    var delegate: Classy? = Classy() 

    func myFunc() { 
    delegate?.eventHappened() 
    } 
} 

enter image description here

Come esercizio esoterica questo potrebbe essere interessante nello spingere i limiti di ciò che una classe potrebbe fare, ma nessuno dovrebbe ogni proveremo a dichiarare un protocollo all'interno di una classe. I protocolli riguardano la composizione del tipo e le raccolte. Non esiste uno scenario di riutilizzo del codice quando si è limitati a essere nella stessa classe esterna.

+0

I protocolli delegati devono essere implementati dagli utenti di questa classe. Quello che stai descrivendo come un problema non è un problema, è un modello di progettazione software essenziale utilizzato nelle strutture Cocoa e CocoaTouch di Apple. –

+0

È possibile ottenere una panoramica completa di come i delegati devono essere utilizzati in Cocoa _ (e per estensione, Objective-C & Swift, poiché il primo è stato progettato in tandem con Cocoa e quest'ultimo principalmente per le app Cocoa) _ in Apple [ Guida alle competenze di Cocoa Core, sezione Delega] (https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14-SW1). –