2016-02-27 30 views
33

ho una classe principale, fornendo anche uno spazio dei nomi:Estensione di un tipo nidificato a Swift

class A { 
} 

e una classe annidata aggiunto tramite un prolungamento (tutti per il bene di utilizzare file separati):

extension A { 
    class B { 
    } 
} 

Voglio aggiungere funzionalità alla classe nidificata (B) estendendola; Ho provato:

extension A.B { 
} 

ottengo " 'B' non è un tipo di utente 'A'".

(Ho anche provato alcune cose meno ragionevoli, ma io li omettere qui per evitare l'imbarazzo. Docs lettura rapida e usare Google per "rapida estensione classe annidata" non hanno dato neanche una risposta.)

Qualsiasi idea se e come ciò potrebbe essere realizzato?


UPDATE:

questo codice funziona come previsto quando in un unico file (o in un parco giochi), grazie alla user3441734 per provarlo!

Ancora non funziona quando le 3 parti sono in file separati, forse un bug nell'attuale implementazione del compilatore Swift. Presenterò un bug report ad Apple.

+0

Quale versione di Xcode/Swift stai usando? –

+0

Ciao Martin. Per essere chiari, ciascuna delle definizioni è in un file separato. Stando così le cose, sono appena riuscito a riprodurre il problema in Xcode 7.3.1 con Swift 2.2. Se si inseriscono tutte le definizioni in un file (come nel caso del campo giochi nelle risposte di seguito), tutto funziona correttamente. In altre parole, questo non è un problema con Swift in quanto tale, ma con il compilatore. – Baglan

risposta

61

Sembra che questo problema è legato alla SR-631. Ho riscontrato un problema simile, suppongo che il compilatore stia tentando di elaborare il file in cui estendi la classe nidificata prima di quella in cui è definita. Quindi hai questo errore dicendo che A non ha membri B.

La soluzione che ho trovato è andare alle impostazioni di destinazione, apri Build Phases.

enter image description here

Lì, in Compile Sources sezione si dovrebbe mettere il file in cui si definiscono i file sopra di classe nidificato in cui si estende esso.

+7

Grazie per la risposta! Il fatto che l'ordinamento delle fonti risolva il problema probabilmente significa che c'è un certo numero di passaggi che il compilatore prende quando risolve i simboli e questo caso va oltre questo numero. Ho inviato un bug report ad Apple e, si spera, faranno qualcosa a riguardo in una futura versione di Xcode. – Baglan

+1

C'è un modo per risolvere il problema anche quando si utilizza il compilatore rapido attraverso l'interfaccia della riga di comando? – Evert

3

questo funziona nel mio parco giochi, come previsto

class A { 
} 
extension A { 
    class B { 
    } 
} 
extension A.B { 
    func foo() { 
     print("print from extension A.B") 
    } 
} 
let ab = A.B() 
ab.foo() // print from extension A.B 
+0

Effettivamente. Suppongo che questo sia un bug nel modo in cui l'implementazione corrente di Swift in Xcode elabora i file. Presenterò una segnalazione di bug ad Apple. Grazie! – Baglan

Problemi correlati