Swift中结构体如果定义成常量,原则上来说是不可变的,同一个方法无论调用多少遍计算出来的结果都是一样的。
然而Swift有些结构体初始化的时候需要传入一个闭包,做一些事情,这就为常量结构体不可变带来一些隐患。
比如有一个迭代器AnyIterator初始化的时候闭包引入一个变量value,每次迭代时变量返回并+1。
因为AnyIterator引用了外部变量,无论这个AnyIterator被copy多少份他们都共同通过闭包拥有这个value变量地址。
实际项目使用的时候创建了一个函数返回了一个迭代器,多次使用之后出了bug,本来很高兴以为发现了swift的bug。
后来仔细一想发现是自己使用错了,其实我应该返回的是一个序列,而不是一个迭代器,通过AnySequence创建AnyIterator,把AnyIterator引用的value变量放在AnySequence闭包内。
总结: Swift中单纯使用结构体的确能保证代码的安全性,但是一旦结构体和类或者闭包结合,也是很容易出问题的,需要注意。
只有迭代器时 通过序列持有迭代器
网友评论