Ich habe diese For-In-Schleife:
for button in view.subviews {
}
Jetzt möchte ich, dass die Schaltfläche in eine benutzerdefinierte Klasse umgewandelt wird, damit ich ihre Eigenschaften verwenden kann.
Ich habe es versucht: for button in view.subviews as AClass
Aber es funktioniert nicht und gibt mir einen Fehler:'AClass' does not conform to protocol 'SequenceType'
Und ich habe es versucht: for button:AClass in view.subviews
Aber das funktioniert auch nicht.
for-loop
swift
for-in-loop
Arbitur
quelle
quelle
for button in view.subviews as [AClass]
Antworten:
Für Swift 2 und höher:
Swift 2 fügt Fall Muster zu für Schleifen, die es noch einfacher und sicherer macht Guss in einem eintippen für Schleife:
Warum ist das besser als das, was Sie in Swift 1.2 und früher tun könnten ? Mit Fallmustern können Sie Ihren spezifischen Typ aus der Sammlung auswählen. Es entspricht nur dem Typ, den Sie suchen. Wenn Ihr Array also eine Mischung enthält, können Sie nur einen bestimmten Typ bearbeiten.
Beispielsweise:
Ausgabe:
Für Swift 1.2 :
In diesem Fall wird ein Casting durchgeführt
view.subviews
und nichtbutton
. Sie müssen es daher auf das Array des gewünschten Typs herabstufen:Hinweis: Wenn der zugrunde liegende Array-Typ nicht lautet
[AClass]
, stürzt dies ab. Das sagt dir der!
Onas!
. Wenn Sie sich über den Typ nicht sicher sind, können Sie eine bedingte Umwandlungas?
zusammen mit einer optionalen Bindung verwendenif let
:Für Swift 1.1 und früher:
Hinweis: Dies stürzt auch ab, wenn die Unteransichten nicht alle vom Typ sind
AClass
. Die oben aufgeführte sichere Methode funktioniert auch mit früheren Versionen von Swift.quelle
[ ]
genau wie in diesem Beispiel in Klammern stehen. Vielleicht bin ich es nur, aber ich dachte, es war zunächst nur eine Formatierungsoption im Codebeispiel :) Ich nehme an, das liegt daran, dass wir in ein Array umwandeln.[Class]
sieht einfach viel besser aus alsArray<Class>
.Diese Option ist sicherer:
oder schnell:
quelle
Sie können auch eine
where
Klausel verwendenquelle
button
innerhalb des Schleifenkörpers, der das Ziel der anderen Lösungen ist. Dies führt also nur den Schleifenkörper auf Elementen aus, vonview.subviews
denenUIButton
s sind, hilft aber nicht, z. B. beim AufrufenAClass
-spezifischer Methoden aufbutton
.where
nur Wachen und nicht werfen.where
kann eleganter und lesbarer sein für Fälle (Wortspiel unbeabsichtigt), in denen Sie nur einen Booleschen Schutz benötigen.Die Antworten sind korrekt, ich wollte dies nur als Ergänzung hinzufügen.
Bei Verwendung einer for-Schleife mit Force Casting stürzt der Code ab (wie bereits von anderen erwähnt).
Aber anstatt eine if-Klausel zu verwenden,
Eine andere Möglichkeit ist die Verwendung einer while-Schleife:
Dies scheint bequemer zu sein, wenn einige Elemente (aber nicht alle) des Arrays vom Typ sind
AClass
.Obwohl ich mich vorerst (ab Swift 5) für die for-case-Schleife entscheiden würde:
quelle
Die Antwort von vacawama war in Swift 1.0 korrekt. Und funktioniert nicht mehr mit Swift 2.0.
Wenn Sie es versuchen, wird eine ähnliche Fehlermeldung angezeigt:
In Swift 2.0 müssen Sie wie folgt schreiben:
quelle
Sie können das Casting durchführen und gleichzeitig sicher sein:
quelle