gpt4 book ai didi

swift - 在 Swift 中实现可枚举/集合类

转载 作者:搜寻专家 更新时间:2023-10-31 21:58:43 24 4
gpt4 key购买 nike

我正在尝试实现类(implements SequenceType),它似乎比我预期的要复杂一些。在 C# 中,我只需要实现 IEnumerable 并且“yield return”使它变得非常简单。在 python 中与 __iter__()yield 相同。但是在 Swift 中我不知道为什么它恰好过于复杂。这是代码

class Nums : SequenceType{

let list = [1,2,3,4,5]

func generate() -> GeneratorOf<Int?> {

return GeneratorOf<Int?>{

for i in self.list{
return i
}

return nil
}
}
}

当我在 for-in 中调用它时,它会进入无限循环。

如果在 swift 中实现可迭代类,正确的方法是什么?

最佳答案

return发电机内部不像yield那样工作在 C#、Python 和其他语言中。这只是一个普通的 return声明。

相反,Swift 生成器使用可选的值 — Some(x)指示序列中的下一项,None (或 nil )表示序列结束。

您传递给 GeneratorOf<Int> 的 block 构造函数(顺便说一下,不需要使用 Int? )将在每一步 被调用,并且每次被调用时都应该产生下一个值,或者 nil当它完成时。因此,您可以使用可变变量来跟踪状态:

func generate() -> GeneratorOf<Int>
{
var i = 0

return GeneratorOf<Int> {
if i >= self.list.count { return nil }
return self.list[i++]
}
}

或者您甚至可以使用您的 list的内置生成器:

func generate() -> GeneratorOf<Int>
{
var g = self.list.generate()

return GeneratorOf<Int> {
return g.next() // not very exciting... we might as well have returned g itself
}
}

关于swift - 在 Swift 中实现可枚举/集合类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com