我的代碼目前在我的iOS項目,看起來像這樣:等效for循環的複雜條件
for var i = 0; CGFloat(i) * gridSpacing.width * scale < bounds.width; ++i
我現在收到警告說,這種風格for循環將被棄用。無論我在Stack Overflow和其他地方看到什麼,都建議對複雜for循環使用stride。然而,這裏的步幅並沒有幫助我,因爲最終條件不是與另一個整數的簡單比較。
如何在swift中使用for-in循環執行此操作?
請注意,我可以循環一個CGFloat,但我想通過反覆添加浮動來避免增量錯誤。
我也可以使用while循環,但是我在同一個函數中有幾個這樣的循環,併爲i創建了一個很好的新範圍。 Swift似乎不喜歡任意新的範圍。
編輯:基於@ Sulthan的回答,我創建了一個SequenceType來完成此操作。 IMO,這樣的事情應該是SWIFT如果毛圈被刪除:
struct forgenerator : GeneratorType
{
typealias Element = Int
typealias Condition = (Element) -> Bool
var idx : Element
var condition : Condition
var increment: Element
mutating func next() -> Element? {
if condition(idx)
{
let result = idx
idx += increment
return result
}
return nil
}
}
struct forsequence : SequenceType
{
typealias Generator = forgenerator
var startPoint : Generator.Element
var condition : Generator.Condition
var increment : Generator.Element
func generate() -> Generator {
return forgenerator(idx: startPoint, condition: condition, increment: increment)
}
}
func forgen(start: Int, condition: (Int) -> Bool, increment: Int) -> forsequence
{
return forsequence(startPoint: start, condition: condition, increment: increment)
}
func forgen(start: Int, condition: (Int) -> Bool) -> forsequence
{
return forgen(start, condition: condition, increment: 1)
}
用法:
for i in forgen(0, condition: { CGFloat($0) * self.gridSpacing.width * self.scale < self.bounds.width})
注意,不得不在這裏使用自無處不因爲所有這些增值經銷商是一個類的成員。
這可能是最接近的答案,但我不愛背到結束條件。原始條件要更直接明白。是否有一個更高級別的構造可以迭代一個值直到滿足任意的結束條件? –
@StevenSchveighoffer這正是'while'循環所做的。您也可以將該功能提取到一個函數中,該函數將爲每次迭代執行閉包。或者,如果您想要更抽象的解決方案,請創建您自己的Stridable。 – Sulthan
對,我可以切換到一個while循環,但是變量聲明必須在循環範圍之外(for的一個方便的特性,考慮swift不允許任意範圍)。我正在尋找的是類似於步幅的東西,但是它允許任意的結束條件而不是終點。 –