gpt4 book ai didi

swift - 使用 GeneratorOf 结构实现 SequenceType 的自定义列表数据结构

转载 作者:行者123 更新时间:2023-11-28 07:05:14 24 4
gpt4 key购买 nike

我试图理解生成器和序列,这让我产生了实现自己的列表数据结构和实现协议(protocol)以使用 forIn 循环的想法。我的代码:

class GSList<T> : SequenceType
{
var Next : GSList<T>?
var Value : T

init(_ value: T, next : GSList<T>?)
{
self.Value = value
self.Next = next
}

func add(list: GSList<T>)
{
if (self.Next != nil)
{
self.Next?.add(list)
} else
{
self.Next = list
}
}

typealias Generator = GeneratorOf<GSList<T>>

func generate() -> Generator
{
var current: GSList<T>? = self
println(current?.Value)

return GeneratorOf
{ () -> GSList<T>? in

let returnValue = current
current = self.Next
println(self.Value)
println(current?.Value)
return returnValue
}
}
}


var list1 = GSList(1, next: nil)
var list2 = GSList(2, next: nil)
var list3 = GSList(3, next: nil)
var list4 = GSList(4, next: nil)
var list5 = GSList(5, next: nil)


list1.add(list2)
list1.add(list3)
list1.add(list4)
list1.add(list5)

var generator = list1.generate()

generator.next()
generator.next()
generator.next()
generator.next()
generator.next()

它没有任何编译时错误,但问题是 current 变量没有用 generate() 中的 Next 值更新方法:

func generate() -> Generator
{
var current: GSList<T>? = self
println(current?.Value)

return GeneratorOf
{ () -> GSList<T>? in

let returnValue = current
current = self.Next
println(self.Value)
println(current?.Value)
return returnValue
}
}

所以调用下一个 generator.next() 总是返回第一个项目。

我怎样才能避免这种情况?

最佳答案

你的线路

current = self.Next

应该是

current = current?.Next

关于swift - 使用 GeneratorOf 结构实现 SequenceType 的自定义列表数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830080/

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