У меня есть код в настоящее время в моем проекте IOS, который выглядит следующим образом:Эквивалент для контура сложного условия
for var i = 0; CGFloat(i) * gridSpacing.width * scale < bounds.width; ++i
Я теперь получать предупреждения, что этот стиль для цикла устареет. Везде, где я смотрю на Stack Overflow и в других местах, предлагается использовать шаг для сложных циклов. Тем не менее, шаг не помогает мне здесь, так как конечное условие не является простым сравнением с другим целым числом.
Как это сделать в быстром режиме с помощью встроенного контура?
Примечание. Я мог бы зацикливать CGFloat, но я хочу избежать инкрементной ошибки, повторно добавляя поплавки.
Я мог бы использовать цикл while, но у меня есть несколько из этих циклов в одной и той же функции, и для создания новой новой области для i. Swift, похоже, не похож на произвольные новые области.
Редактировать: в соответствии с ответом @ Sulthan, я создал SequenceType для этого. IMO, что-то, как это должно быть в стрижа, если для петель удаляются:
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 не позволяет использовать произвольные области). То, что я ищу, - это что-то вроде шага, но это позволяет произвольное конечное условие вместо конечной точки. –