eine Hilfsfunktion verwenden (ursprünglich Converting a C-style for loop that uses division for the step to Swift 3 definiert)
public func sequence<T>(first: T, while condition: @escaping (T)-> Bool, next: @escaping (T) -> T) -> UnfoldSequence<T, T> {
let nextState = { (state: inout T) -> T? in
// Return `nil` if condition is no longer satisfied:
guard condition(state) else { return nil }
// Update current value _after_ returning from this call:
defer { state = next(state) }
// Return current value:
return state
}
return sequence(state: first, next: nextState)
}
Sie die Schleife als
let num = 1000
for i in sequence(first: 5, while: { num/$0 > 0 }, next: { $0 * 5 }) {
print(i)
}
Eine einfachere Lösung wäre eine while-Schleife schreiben:
var i = 5
while num/i > 0 {
print(i)
i *= 5
}
aber der Vorteil der ersten Lösung besteht darin, dass der Umfang der Schleifenvariable auf den Schleifenkörper beschränkt ist und dass die Schleifenvariable eine Konstante ist.
Swift 3.1 liefert ein prefix(while:)
method for sequences, und dann wird die Hilfsfunktion nicht mehr erforderlich ist:
let num = 1000
for i in sequence(first: 5, next: { $0 * 5 }).prefix(while: { num/$0 > 0 }) {
print(i)
}
Alle obigen Lösungen sind "äquivalent" auf den C-Schleife gegeben. jedoch sie alle können abstürzen, wenn num
-Int.max
und $0 * 5
überläuft der Nähe ist. Wenn das ein Problem ist, müssen Sie überprüfen, wenn $0 * 5
in den Ganzzahlbereich vor die Multiplikation passt.
Eigentlich macht, dass die Schleife einfacher - zumindest, wenn wir davon ausgehen, dass num >= 5
so dass die Schleife mindestens einmal ausgeführt wird:
for i in sequence(first: 5, next: { $0 <= num/5 ? $0 * 5 : nil }) {
print(i)
}
Wenn wir über Integer sprechen, ist 'num/i> 0 'nicht dasselbe wie das Schreiben von' num> i'? – Sulthan
@Sulthan Nein, bedenke 'num = 5' &' i = 5', sowie 'num = 5' &' i = -5' – Hamish
und du musst immer noch i im for loop Zustand verwenden – alex