2016-02-27 19 views
33

Ich habe eine Hauptklasse, auch einen Namespace bereitstellt:Erweiterung eines verschachtelten Typ in Swift

class A { 
} 

und eine verschachtelte Klasse über eine Erweiterung hinzugefügt (alle im Interesse separate Dateien zu verwenden):

extension A { 
    class B { 
    } 
} 

Ich möchte Funktionalität zu der geschachtelten Klasse (B) hinzufügen, indem Sie es erweitern; Ich habe versucht:

extension A.B { 
} 

Ich bekomme "'B' ist kein Mitgliedstyp von 'A'".

(ich habe auch versucht, einige weniger vernünftige Dinge, aber ich werde sie hier auslassen Verlegenheit zu vermeiden. Lesen Swift-Dokumentation und für „swift verschachtelte Klassenerweiterung“ googeln haben entweder eine Antwort nicht nachgegeben.)

Jede Idee ob und wie das erreicht werden könnte?


UPDATE:

Dieser Code funktioniert wie erwartet, wenn in einer einzigen Datei (oder in einem Spielplatz), dank es zum Ausprobieren user3441734!

Funktioniert immer noch nicht, wenn die 3 Teile in separaten Dateien sind, vielleicht ein Fehler in der aktuellen Implementierung des Swift-Compilers. Ich werde einen Fehlerbericht an Apple senden.

+0

Welche Version von Xcode/Swift verwenden Sie? –

+0

Hallo Martin. Um es klar zu sagen, jede der Definitionen befindet sich in einer separaten Datei. In diesem Fall habe ich es gerade geschafft, das Problem in Xcode 7.3.1 mit Swift 2.2 zu reproduzieren. Wenn Sie alle Definitionen in eine Datei (wie bei den Spielplatz in Antworten unten), alles funktioniert gut. Mit anderen Worten, dies ist kein Problem mit Swift als solcher, sondern mit dem Compiler. – Baglan

Antwort

61

Es scheint, wie dieses Problem zu SR-631 zusammenhängt. Ich habe ein ähnliches Problem festgestellt. Ich vermute, dass der Compiler versucht, die Datei zu verarbeiten, in der Sie die verschachtelte Klasse vor der definierten erweitern. Deshalb haben Sie diesen Fehler, der besagt, dass A kein Mitglied B hat.

Die Lösung, die ich gefunden habe, ist, zu Ihren Zieleinstellungen zu gehen, öffnen Sie Build Phases.

enter image description here

Dort in Compile Sources Abschnitt Sie die Datei in dem Sie die verschachtelte Klasse über Dateien definieren, wo Sie es verlängern setzen sollte.

+7

Vielen Dank für die Antwort! Die Tatsache, dass die Reihenfolge der Quellen das Problem löst, bedeutet wahrscheinlich, dass es eine bestimmte Anzahl von Durchläufen gibt, die der Compiler bei der Auflösung von Symbolen benötigt, und dieser Fall liegt außerhalb dieser Zahl. Ich habe einen Fehlerbericht an Apple gesendet und hoffentlich werden sie in einer zukünftigen Version von Xcode etwas dagegen tun. – Baglan

+1

Gibt es eine Möglichkeit, dies auch zu beheben, wenn der Swift-Compiler über die Befehlszeilenschnittstelle verwendet wird? – Evert

3

das funktioniert in meinem Spielplatz, wie erwartet

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

Tatsächlich tut es das. Das, ich nehme an, das ist ein Fehler in wie aktuelle Implementierung von Swift in Xcode Dateien verarbeitet. Ich werde einen Fehlerbericht an Apple senden. Vielen Dank! – Baglan