gpt4 book ai didi

swift - 在 Swift 中通过引用传递变量

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:05 26 4
gpt4 key购买 nike

我开始学习 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 在 stdlib 中为这些集合实现了写时复制。这不是语言级别的功能;它实际上是为数组和字符串(以及其他一些类型)显式实现的。因此,您可以拥有大型阵列的多个副本,它们都共享相同的后备存储。

inout 与“通过引用”不同。它实际上是“进出”。该值在函数开始时被复制进来,然后在结束时复制回原来的位置。

Swift 的方法往往对常见用途具有高性能,但 Swift 并没有像 C++ 那样做出强大的性能 promise 。 (也就是说,这使得 Swift 在某些情况下比 C++ 更快,因为 Swift 在选择数据结构方面没有那么受限。)作为一般规则,我发现很难推断出可能的性能任意 Swift 代码。很容易推断最坏情况下的性能(假设复制总是发生),但很难确定何时可以避免复制。

关于swift - 在 Swift 中通过引用传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45615408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com