我正在尝试获取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)
当我们查看odds和evens数组时,它们没有改变,因为我们更改了source和destination数组.
我知道我可以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)
有没有办法通过引用而不是按值将这些数组分配给变量?
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
| 归档时间: |
|
| 查看次数: |
8480 次 |
| 最近记录: |