Swift中的迭代器

Swift中结构体如果定义成常量,原则上来说是不可变的,同一个方法无论调用多少遍计算出来的结果都是一样的。

然而Swift有些结构体初始化的时候需要传入一个闭包,做一些事情,这就为常量结构体不可变带来一些隐患。

比如有一个迭代器AnyIterator初始化的时候闭包引入一个变量value,每次迭代时变量返回并+1。

因为AnyIterator引用了外部变量,无论这个AnyIterator被copy多少份他们都共同通过闭包拥有这个value变量地址。

实际项目使用的时候创建了一个函数返回了一个迭代器,多次使用之后出了bug,本来很高兴以为发现了swift的bug。

后来仔细一想发现是自己使用错了,其实我应该返回的是一个序列,而不是一个迭代器,通过AnySequence创建AnyIterator,把AnyIterator引用的value变量放在AnySequence闭包内。

总结: Swift中单纯使用结构体的确能保证代码的安全性,但是一旦结构体和类或者闭包结合,也是很容易出问题的,需要注意。

只有迭代器时
通过序列持有迭代器
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容