Die Swift 2-Protokollerweiterung ruft die überschriebene Methode nicht korrekt auf

8

Ich habe ein Problem mit Swift 2-Protokollerweiterungen mit Standardimplementierungen festgestellt. Der Grundgedanke ist, dass ich eine Standardimplementierung einer Protokollmethode bereitgestellt habe, die ich in einer Klasse überschreibe, die das Protokoll implementiert. Diese Protokollerweiterungsmethode wird von einer Basisklasse aufgerufen, die dann eine Methode aufruft, die ich in einer abgeleiteten Klasse überschrieben habe. Das Ergebnis ist, dass die überschriebene Methode nicht aufgerufen wird.

Ich habe versucht, das Problem auf den kleinstmöglichen Spielplatz zu bringen, der das Problem unten veranschaulicht.

%Vor%     
Raul Agrait 03.08.2015, 19:21
quelle

3 Antworten

7

Leider haben Protokolle (noch) kein so dynamisches Verhalten.

Aber Sie können das (mit Hilfe von Klassen) tun, indem Sie commonBehavior() in ParentClass implementieren und in ChildClass überschreiben. Du brauchst auch CommonThing oder eine andere Klasse, um zu CommonTrait zu passen, was dann die Oberklasse von ParentClass ist:

%Vor%

Da dies nur eine kurze Lösung für Ihr Problem ist, hoffe ich, dass es in Ihr Projekt passt.

    
Qbyte 03.08.2015, 22:38
quelle
1
___ qstntxt ___

Ich habe ein Problem mit Swift 2-Protokollerweiterungen mit Standardimplementierungen festgestellt. Der Grundgedanke ist, dass ich eine Standardimplementierung einer Protokollmethode bereitgestellt habe, die ich in einer Klasse überschreibe, die das Protokoll implementiert. Diese Protokollerweiterungsmethode wird von einer Basisklasse aufgerufen, die dann eine Methode aufruft, die ich in einer abgeleiteten Klasse überschrieben habe. Das Ergebnis ist, dass die überschriebene Methode nicht aufgerufen wird.

Ich habe versucht, das Problem auf den kleinstmöglichen Spielplatz zu bringen, der das Problem unten veranschaulicht.

%Vor%     
___ tag123swift ___ Swift ist eine universelle Open-Source-Programmiersprache, die von Apple Inc. für ihre Plattformen und Linux entwickelt wurde. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder für Code in Swift. Verwenden Sie die Tags [ios], [osx], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks. ___ tag123swift2 ___ Verwenden Sie dieses Tag nur für Fragen, die sich direkt auf Änderungen in Version 2.x der Apple Swift-Programmiersprache beziehen. Verwenden Sie das Tag [swift] für allgemeinere Sprachfragen oder die Tags [ios], [cocoa], [apple-watch] usw. für Fragen zur Entwicklung auf Apple-Plattformen. ___ answer31797887 ___

Leider haben Protokolle (noch) kein so dynamisches Verhalten.

Aber Sie können das (mit Hilfe von Klassen) tun, indem Sie %code% in %code% implementieren und in %code% überschreiben. Du brauchst auch %code% oder eine andere Klasse, um zu %code% zu passen, was dann die Oberklasse von %code% ist:

%Vor%

Da dies nur eine kurze Lösung für Ihr Problem ist, hoffe ich, dass es in Ihr Projekt passt.

    
___ qstnhdr ___ Die Swift 2-Protokollerweiterung ruft die überschriebene Methode nicht korrekt auf ___ answer34554581 ___

Das ist Swifts Verhalten. Es kann gut oder schlecht sein, je nach Ihren Bedürfnissen. Schnelle Verwendung statischer Versand, also welche Methode aufgerufen wird, muss während der Kompilierung bekannt sein. Es gibt einige Vorteile und wie gewöhnlich einige Nachteile. Um zu sehen, wie Swift zur Zeit funktioniert, siehe nächstes sehr einfaches Beispiel. Für mich sieht es logisch aus ...

%Vor%     
___ answer3180213 ___

Um meinen Mangel zu verstehen, verstehe ich, was das Wort "Yet" in einem unspezifischen Fehler bedeutet. Ich fand heraus, dass ich nicht scheinen kann, eine Funktion mit Argumenten zu schreiben, die erweiterte Funktion zu überschreiben, und der Compiler gibt mir einen solchen Fehler, aber wenn ich eine einfache Funktion ohne Argumente schreibe, eine benutzerdefinierte Implementierung mache und sie aufruft mit meiner überschriebenen "einfachen Funktion" funktioniert es:

%Vor%     
___
ReduxDJ 16.10.2015 22:01
quelle
1

Das ist Swifts Verhalten. Es kann gut oder schlecht sein, je nach Ihren Bedürfnissen. Schnelle Verwendung statischer Versand, also welche Methode aufgerufen wird, muss während der Kompilierung bekannt sein. Es gibt einige Vorteile und wie gewöhnlich einige Nachteile. Um zu sehen, wie Swift zur Zeit funktioniert, siehe nächstes sehr einfaches Beispiel. Für mich sieht es logisch aus ...

%Vor%     
user3441734 01.01.2016 08:15
quelle

Tags und Links