Dies wäre ein Weg, es in Swift zu tun 3:
var parentView: View! = view
while parentView != nil {
// Do stuff
parentView = parentView.parent
}
Wenn Sie den Loop Progression Sachen neben while
und nicht am Ende des Blocks gruppieren möchten, können Sie defer
wie folgt verwenden :
var parentView: View! = view
while parentView != nil {
defer { parentView = parentView.parent }
// Do stuff
}
Wenn Sie den Bereich von parentView
beschränken möchten, können Sie alles in einem do
Block kapseln:
do {
var parentView: View! = view
while parentView != nil {
defer { parentView = parentView.parent }
// Do stuff
}
}
Aber es ist ziemlich ausführliche, so dass Sie eine neue generische Funktion für ähnliche Schleifen, wie diese definieren könnte:
func kindaCStyleLoop<T>(first: T, obtainNext: T -> T?, action: T ->()) {
var current: T! = first
repeat {
action(current)
current = obtainNext(current)
} while current != nil
}
kindaCStyleLoop(view, obtainNext: { $0.parent }) {
// Do stuff with $0
}
Und eine letzte, die auf GeneratorType
und SequenceType
setzt mit der for-in-Schleife Syntax zu ermöglichen :
struct CStyleGenerator<T> : GeneratorType, SequenceType {
let getNext: T -> T?
var current: T!
init(first: T, getNext: T -> T?) {
self.getNext = getNext
self.current = first
}
mutating func next() -> T? {
defer {
if current != nil {
current = getNext(current)
}
}
return current
}
}
for parentView in CStyleGenerator(first: view, getNext: { $0.parent }) {
// Do stuff with parentView
}
** nicht von Apple Es ist wirklich ** wer mag C-Schleifen nicht, aber [Erica Sadun] (https://github.com/apple/swift-evolution/blob/master/proposals/0007-remove-c-style-for-loops.md), Andy Matuschak (Khan-Akademie), Keith Smiley (Lyft) und andere in der Mailing-Liste. Chris Lattner (Apple) steht ihnen offen gegenüber. Schließlich hat der Ausschuss zugestimmt, ihn zu streichen. – adib
Bitte fügen Sie die Lösung nicht als "Update" zu der Frage hinzu. Wenn Sie Ihre eigene Lösung teilen möchten, können Sie eine Antwort posten. – FelixSFD
@FelixSFD danke für den Rat, extrahiert, dass zu beantworten – brigadir