我只是在浏览一些显然在 Beta3 中已经过时的 Swift tuts ...
func exchange<T>(data:[T], i:Int, j:Int)
{
let temp = data[i];
data[i] = data[j];
data[j] = temp;
}
Playgrounds 告诉我:
错误:@lvalue $T8 与 T 不同。
如何更改它才能使其正常工作?
最佳答案
Swift 中的数组是值类型。这意味着 data
在传递给您的 exchange
方法时被复制,但您正试图修改副本以影响原始版本。相反,您应该做以下两件事之一:
1。将 data
定义为 inout
参数:
func exchange<T>(inout data:[T], i:Int, j:Int)
然后在调用它的时候你必须在调用之前添加一个&
:
var myArray = ["first", "second"]
exchange(&myArray, 0, 1)
2。返回数组的副本(推荐)
func exchange<T>(data:[T], i:Int, j:Int) -> [T]
{
var newData = data
newData[i] = data[j]
newData[j] = data[i]
return newData
}
我推荐这种方式而不是 in-out 参数,因为 in-out 参数会创建更复杂的状态。您有两个变量指向并可能操纵同一 block 内存。如果 exchange
决定在单独的线程上完成它的工作怎么办?还有一个原因是 Apple 决定制作数组值类型,使用 in-out 颠覆它。最后,返回副本更接近 Functional Programming这是 Swift 可以推进的一个有前途的方向。我们的应用程序中的状态越少,我们产生的错误就越少(通常)。
关于arrays - Swift 通用数组 'not identical' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24784252/