为了账号安全,请及时绑定邮箱和手机立即绑定

是通过价值快速传递,还是通过参考传递?

/ 猿问

是通过价值快速传递,还是通过参考传递?

芜湖不芜 2019-07-03 16:20:26

是通过价值快速传递,还是通过参考传递?

我对SWIFT非常陌生,我刚刚看到类通过引用传递,数组/字符串等被复制。

引用传递是否与目标C或Java中传递“a”引用的方式相同,还是通过引用传递正确?


查看完整描述

3 回答

?
守候你守候我

SWIFT中的事物类型

规则是:

  • 类实例是参考类型(即:你的对类实例的引用实际上是指针)

  • 函数是引用类型。

  • 其他一切都是价值类型“其他一切”只是指结构实例和枚举实例,因为这就是SWIFT中的全部内容。例如,数组和字符串是结构化实例。你,你们能,会,可以传递对其中之一的引用(作为函数参数),方法是inout就像Newacct指出的那样。但是类型本身就是一个值类型。

引用类型对你意味着什么?

引用类型对象在实践中是特殊的,因为:

  • 仅仅是分配或传递函数就可以产生对同一个对象的多个引用。

  • 对象本身是可变的,即使对它的引用是常量(let,明示的或暗示的)。

  • 对对象的突变会影响该对象,所有对它的引用都可以看到这一点。

这些可能是危险的,所以要保持警惕。另一方面,传递引用类型显然是有效的,因为只有指针被复制和传递,这很简单。

价值类型对你意味着什么?

显然,传递值类型“更安全”,而且let意思是:您不能通过let推荐信。另一方面,安全是通过单独复制价值来实现的,不是吗?这难道不意味着传递值类型可能很昂贵吗?

好吧,是和不是。没有你想的那么糟。正如Nate Cook所说,传递值类型并不是必然意味着复制,因为let(显式或暗示)保证不变性,因此不需要复制任何东西。甚至进入一个var引用并不意味着将要被复制,只是他们能,会,可以如果有必要的话(因为有变异)。医生特别建议你不要把内裤弄得乱七八糟。


查看完整回答
反对 回复 2019-07-03
?
慕仙森

它是 按值传递当参数不是inout.

它是 参照传递如果参数是inout..但是,由于需要显式地使用&运算符传递到inout参数,因此它可能不符合传统的按引用传递的定义,即直接传递变量。


查看完整回答
反对 回复 2019-07-03
?
慕勒3428872

SWIFT中的所有内容在默认情况下都由“复制”传递,因此当您传递值类型时,您将得到值的副本,而当您传递引用类型时,您将得到引用的副本,以及所包含的所有内容。(也就是说,引用的副本仍然指向与原始引用相同的实例。)

我在上面的“复制”中使用了恐慌引号,因为SWIFT做了很多优化工作;只要有可能,它就不会复制,直到出现变异或可能发生变异。由于参数在默认情况下是不可变的,这意味着大多数情况下没有复制。


查看完整回答
反对 回复 2019-07-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信