arrays - Swift 通用数组 'not identical' 错误

标签 arrays swift generics

我只是在浏览一些显然在 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/

相关文章:

swift - 使用 FCM 的推送通知不适用于我的所有设备

haskell - 可输入 Maybe 和 Either

java - 泛型与功能相似方法的 Eclipse 错误

php - 数组文件 isset 错误返回 False

javascript - 如何在javascript中用空行分割字符串

c++ - 为什么我的函数打印地址而不是数组的内容?

python - 如何有效地将 4D numpy 数组转换为以索引为列的 ​​pandas DataFrame?

json - 在 Codable - Swift 中使用 "/"和 "%"

Swift:重新激活披露指示器上的点击手势

generics - 将使用泛型的 Java 5 代码转换为可以在 J2ME 设备上运行的代码?