【发布时间】:2018-01-18 19:16:29
【问题描述】:
我开始学习 c++,现在我想知道我是否也可以在 Swift 中做一些事情。
我从未真正想过当我们将变量作为参数传递给 Swift 中的函数时会发生什么。
我们以string 类型的变量为例。
在 c++ 中,我可以通过复制参数或传递引用/指针来将参数传递给函数。
void foo(string s) 或 void foo (string& s);
在第一种情况下,我的原始变量的副本将被创建,并且 foo 将收到一个副本。在第二种情况下,我基本上是在内存中传递变量的地址而不创建副本。
现在在 Swift 中,我知道我可以将函数的参数声明为 inout,这意味着我可以修改原始对象。
1) func foo(s:String)...
2)func testPassingByReference(s: inout String)...
我对 String 做了一个扩展来打印对象的地址:
extension String {
func address() -> String {
return String(format: "%p", self);
}
}
结果不是我想看到的。
var str = "Hello world"
print(str.address())
0x7fd6c9e04ef0
func testPassingByValue(s: String) {
print("he address of s is: \(s.address())")
}
func testPassingByReference(s: inout String) {
print("he address of s is: \(s.address())")
}
testPassingByValue(s: str)
0x7fd6c9e05270
testPassingByReference(s: &str)
0x7fd6c9e7caf0
我理解为什么当我们按值传递参数时地址不同,但当我们将参数作为 inout 参数传递时,这不是我所期望的。
Apple 开发者网站这样说
In Swift, Array, String, and Dictionary are all value types.
所以问题是,有没有办法避免复制我们传递给函数的对象(我可以有一个非常大的数组或字典)或者 Swift 不允许我们做这样的事情?
【问题讨论】:
标签: swift swift3 memory-address