在Swift中,当您传递值类型时,请将Array表示为函数.数组的副本用于要使用的函数.
但是,https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134上的文档也说:
上面的描述涉及字符串,数组和字典的"复制".您在代码中看到的行为将始终如同副本一样.但是,当绝对必要时,Swift仅在幕后执行实际复制.Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化.
那么这是否意味着复制实际上仅在修改传递的值类型时进行?
有没有办法证明这实际上是潜在的行为?
为什么这很重要?如果我创建一个大的不可变数组并希望将其从函数传递给函数,我当然不希望继续复制它.我是否应该在这种情况下使用NSArrray,或者只要我不尝试操作传入的数组,Swift数组是否正常工作?
现在只要我没有使用var或inout明确地使函数中的变量可编辑,那么该函数无论如何都无法修改数组.那还能复制一份吗?假设另一个线程可以在其他地方修改原始数组(只有它是可变的),在调用该函数时生成一个副本(但只有在传入的数组是可变的时).因此,如果原始数组是不可变的并且函数不使用var或inout,则Swift创建副本没有任何意义.对?那么Apple对上述短语的意思是什么?
我可以在 Swift 中创建一个生成器吗?
使用迭代器,我需要存储中间结果,例如:
struct Countdown: IteratorProtocol, Sequence {
private var value = 0
init(start: Int) {
self.value = start
}
mutating func next() -> Int? {
let nextNumber = value - 1
if nextNumber < 0 {
return nil
}
value -= 1
return nextNumber
}
}
for i in Countdown(start: 3) {
print(i)
} // print 1 2 3
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我需要存储value.
在我的情况下,我想使用生成器而不是迭代器,因为我不想将序列的中间结果存储在每个next.