Я часто использую генераторы в Python. Сейчас я пытаюсь сделать нечто подобное в Swift.
Из бесконечного факториального генератора в Python.
def gen_factorial():
current = 1
N = 1
while True:
yield current
N += 1
current *= N
Версия Swift будет
struct gen_factorial: Sequence, IteratorProtocol
{
var current = 1
var N = 1
mutating func next()-> Int?{
defer {
N += 1
current *= N
}
return current
}
}
Я проверяю это, беря первые 4 элемента с
zip(1...4,
gen_factorial()
).map{$1}
И получите 1, 2, 6, 24
, как и ожидалось.
Но когда я хочу написать вспомогательную функцию take(n, gen)
, чтобы упростить ее, я не могу.
func take(_ n: Int, _ it: AnyIterator<Int>) -> [Int]{
return zip(1...n, it).map {$1}
}
take(4, gen_factorial())
Сообщение об ошибке:
error: cannot convert value of type 'gen_factorial' to expected argument type 'AnyIterator<Int>'
Какого типа должен быть it
, если не AnyIterator?
Я все еще новичок в Swift. Пожалуйста, помогите.