Swift:如何通过引用而不是值来分配变量?

Way*_*man 10 swift

我正在尝试获取Array对它的引用并对其进行修改.因为ArraySwift中的s是值类型而不是引用类型,如果我首先将我的数组赋值给变量,我得到的是数组的副本而不是实际的数组:

var odds = ["1", "3", "5"]
var evens = ["2", "4", "6"]

var source = odds
var destination = evens

var one = odds.first!

source.removeFirst() // only removes the first element of the `source` array, not the `odds` array

destination.append(one)
Run Code Online (Sandbox Code Playgroud)

当我们查看oddsevens数组时,它们没有改变,因为我们更改了sourcedestination数组.

我知道我可以inout在函数上使用参数属性来通过引用而不是通过值传递它们:

func move(inout source: [String], inout destination: [String], value:String) {
    source.removeAtIndex(source.indexOf(value)!)
    destination.append(value)
}

move(&odds, destination: &evens, value:one)
Run Code Online (Sandbox Code Playgroud)

有没有办法通过引用而不是按值将这些数组分配给变量?

Pat*_*ley 6

Array是一个结构体,这意味着它是 Swift 中的值类型。因此,数组总是根据值而不是引用语义来表现。这里的问题是您试图使用可变的、基于引用的逻辑来操作值类型。

您不想依赖函数内部发生的突变来传播回调用者。正如您所发现的,这仅适用于 inout 参数。你应该做的是将变异的数组从函数返回给调用者。面向值编程的要点在于,您拥有哪个数组并不重要,而是任何两个等效的数组或值类型都可以互换。

使用另一种值类型更容易想象。以一个 Int 为例,这个函数会做一些数学运算。

func addFive(int: Int) -> Int {
    return int + 5
}
Run Code Online (Sandbox Code Playgroud)

现在考虑一个类似的函数,但以您尝试使用的面向引用的风格编写:

func addFive(inout int: Int) {
    int = int + 5
}
Run Code Online (Sandbox Code Playgroud)

您可以看到以这种方式对值类型进行操作并不自然。相反,只需从您的函数返回更新后的值(修改后的数组)并从那里继续。

这是使用值语义重构的函数。

func move(source: [String], destination: [String], value:String) -> ([String], [String]) {

    var mutableSource = source
    var mutableDestination = destination

    mutableSource.removeAtIndex(source.indexOf(value)!)
    mutableDestination.append(value)

    return (mutableSource, mutableDestination)
}

let (updatedSource, updatedDestination) = move(odds, destination: evens, value:one)
Run Code Online (Sandbox Code Playgroud)


小智 3

在 Swift 中,不能通过引用将数组分配给变量。

“在 Swift 中,数组、字符串和字典都是值类型……”

来源: https: //developer.apple.com/swift/blog/? id=10