Faul - /inline-Umsetzung eines Protokolls in Swift
Will ich zu faul/inline implementieren ein Protokoll, in Swift.
Also in dem Punkt, der die Implementierung, die ich haben Zugriff auf Variablen außerhalb des Protokolls Umfang ,
Dasselbe wie die Implementierung eines interface in Java ohne die Deklaration einer Klasse:
class MyClass:UIView {
var someComponent:SomeInnerComponent = SomeInnerComponent();
var count:Int = 0;
var a = :SomeProtocol { //<----- IS THIS POSSIBLE, IF YES HOW ?
func a0() {MyClass.count-- }
func a1() {MyClass.count++}
}
someComponenet.delegate = a;
}
protocol SomeProtocol {
func a0()
func a1()
}
Bearbeiten----
Dank schaue ich auf diese Lösung, und ich wollte nicht sehen, wie Sie Zugang zu einer Variablen der übergeordneten Klasse.
alle Beispiele zeigen eine Anonyme Klasse, aber nicht eines der Beispiele ist der Zugriff auf die übergeordneten Variablen .
- Beachten Sie, dass alle Antworten auf die andere Frage, die zu diskutieren Verschlüsse behebt auch deine Frage zu "der Zugriff auf Variablen außerhalb der Protokoll-Bereich." Verschlüsse erfassen und ändern Sie die Variablen.
- Dank schaue ich auf diese Lösung, und ich wollte nicht sehen, wie Sie Zugang zu einer Variablen der übergeordneten Klasse. alle Beispiele zeigen eine Anonyme Klasse, aber nicht eines der Beispiele ist der Zugriff auf die übergeordneten Variablen .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was du suchst, ist eine innere Klasse (nicht unbedingt eine anonyme eins), erklärte in einem Bereich, ermöglicht es den Zugriff auf die
count
variableMyClass
Instanz, und das nimmt ein Protokoll definiert, in einem anderen Bereich. Jetzt Swift hat ein paar der Stücke, aber es sieht nicht wie Sie können setzen Sie alle zusammen in einer Weise, die so prägnant wie das, was Sie vielleicht gesucht werden.Man könnte meinen, über die Deklaration einer inneren Klasse:
Aber das wird nicht funktionieren, weil
count
implizitself.count
, woself
ist einHelper
Instanz, nicht dieMyView
Instanz, die "Eigentümer" derHelper
Instanz. Und gibt es nicht eine Möglichkeit verweisen, dassMyView
Instanz (bzw. seine Eigenschaften) innerhalb einesHelper
's Methoden, da könnte man genauso gut konstruierenMyView.Helper()
ohne eine vorhandeneMyView
Instanz. Innere Klassen (oder geschachtelte Typen im Allgemeinen) im Swift-nest nur im lexikalischen Bereich, nicht in existenzielle Eigentum. (Oder um es anders zu sagen, da Sie verwiesen Java: alle inneren Klassen in Swift sind wie statische innere Klassen in Java. Es gibt keine nicht-statischen inneren Klasse.) Wenn das eine Funktion, die Sie möchten, obwohl, wahrscheinlich ist es es Wert, erzählt Apple, dass Sie es wollen.Könnte man auch versuchen, die Deklaration
Helper
innenMyView.init()
-- in Swift können Sie nest-Typ-Definitionen überall, auch innerhalb von Funktionen oder Methoden von anderen Arten. Dort definiert, es kann beziehen sich aufMyView
's Eigenschaften. Nun ist aber die Typ-Informationen fürHelper
ist nur sichtbar in derMyView.init()
, so dass, wenn Sie zuweisensomeComponent.delegate
(deren Typ ist einfachSomeProtocol
), können Sie nicht nutzen... dieser stürzt der compiler auch. (Das ist eine andere bug report, aber es ist schwer zu sagen, ob der bug ist wirklich "compiler stürzt auf gültige Verwendung" oder "code ist schlecht, aber der compiler stürzt ab, anstatt Fehler".)Die nächste Lösung, die ich mit oben kommen kann sieht man hier:
Wie es funktioniert:
Helper
ist eine innere Struktur (könnte eine Klasse sein, aber eine Struktur ist einfacher)a0
unda1
Methoden, die Befriedigung der Anforderungen derSomeProtocol
a0
unda1
Anruf durch, um die Verschlüssedec
undinc
gespeicherten Eigenschaften (aka Instanz-Variablen) derHelper
structHelper
Instanz (mithilfe der Standard-Mitglied-Weise-Initialisierer,Helper(dec: (Void -> Void), inc: (Void -> Void))
)Helper
, diese Verschlüsse erfassen können Variablen, von wo Sie anrufen die Initialisierung, einschließlich der implizitenself
bezieht sich auf denMyClass
Instanz erstellen derHelper
.Müssen Sie beide
a0
/a1
unddec
/inc
weil Sie brauchen, Verschlüsse (die letztere), nicht die Methoden, für die Erfassung der einschließenden Staat. Und obwohl Verschlüsse und funcs/Methoden sind in vielerlei Hinsicht austauschbar, Sie können nicht erstellen Sie eine Methode/func Umsetzung durch die Zuweisung einer closure an eine Methode/func-name. (Es wäre eine andere Geschichte, wennSomeProtocol
erforderlich abschlusseigenschaften anstelle von Methoden, aber ich gehe davon ausSomeProtocol
ist nicht etwas, das unter Ihrer Kontrolle.)Sowieso, das ist eine Menge von boilerplate und eine Ebene der Abstraktion, die Sie nicht wirklich brauchen, so es ist wahrscheinlich lohnt ein Blick in andere Wege zu Architekten in Ihren code ein.
Anmerkung: mein Beispiel verwendet die Schließung
{ self.count -= 1 }
wo man erwarten könnte{ self.count-- }
. Letzteres funktioniert nicht, weil das eine Ausdruck mit einem Wert, so wird Swift interpretieren es als Kurzformel für die Schließung ist die Rückkehr Wert. Dann werden die sich beschweren, dass Sie zugewiesen() -> Int
- Verschluss, um eine Eigenschaft, die erwartet, dass ein() -> ()
(akaVoid -> Void
) Verschluss. Mit-= 1
statt arbeitet, um dieses Problem.Ich würde für einen anderen Ansatz, ich weiß, das ein ziemlich altes Thema, aber nur für den Fall jemand anderes kämpfen mit diesem Problem:
Mit diesem Ansatz ist es auch möglich, das gleiche Protokoll mehrere Male, sagen wir, dass Ihr Protokoll unterstützt eine generische und Sie wollen, um es zu implementieren zweimal. SomeProtocol< SomeObject > und SomeProtocol< OtherObject > könnte beides sein verwendet auf diese Weise, wenn nötig.
Freundlichen GRÜßEN