gra*_*aci 92 pass-by-reference pass-by-value pass-by-pointer swift
我是Swift的新手,我只是读取类通过引用传递,数组/字符串等被复制.
通过引用传递的方式与Objective-C或Java中的方式相同,其中您实际传递"a"引用或是否通过引用正确传递?
mat*_*att 156
规则是:
类实例是引用类型(即您对类实例的引用实际上是指针)
函数是引用类型
其他一切都是价值类型 ; "其他一切"只是意味着结构和枚举实例的实例,因为这就是Swift的全部内容.例如,数组和字符串是结构实例.正如newacct指出的那样,您可以通过使用inout和获取地址来传递对这些事物之一的引用(作为函数参数).但类型本身就是一种价值类型.
引用类型对象在实践中是特殊的,因为:
仅仅赋值或传递给函数可以产生对同一对象的多个引用
即使对它的引用是常量(let显式或隐含),对象本身也是可变的.
对象的变异会影响该对象,如所有对它的引用所见.
那些可能是危险的,所以要留意.另一方面,传递引用类型显然是有效的,因为只复制并传递指针,这是微不足道的.
显然,传递值类型是"更安全",并且let意味着它所说的内容:您不能通过let引用来改变结构实例或枚举实例.另一方面,安全是通过单独复制价值来实现的,不是吗?这是否会使传递值类型的代价变得昂贵?
嗯,是的,不.它没有你想象的那么糟糕.正如Nate Cook所说,传递值类型并不一定意味着复制,因为let(明示或暗示)保证不变性,因此不需要复制任何东西.甚至突入var参考并不意味着事情会被复制,只有他们可以是如果需要的话(因为有一个突变).文档特别建议你不要让你的短裤扭曲.
new*_*cct 41
当参数不是时,它总是 按值传递inout.
如果参数是,则始终 通过引用传递inout.但是,这有点复杂,因为您需要&在传递给参数时在参数上显式使用运算符inout,因此它可能不适合直接传递变量的传递的传递定义.
Nat*_*ook 36
默认情况下,Swift中的所有内容都通过"复制"传递,因此当您传递值类型时,您将获得该值的副本,并且当您传递引用类型时,您将获得引用的副本,其中包含所有含义.(也就是说,引用的副本仍然指向与原始引用相同的实例.)
我在上面的"副本"周围使用了恐慌引用,因为Swift做了很多优化; 只要有可能,它就不会复制,直到出现突变或突变的可能性.由于默认情况下参数是不可变的,这意味着大多数情况下实际上没有复制.
这是一个通过引用传递的小代码示例.避免这样做,除非你有充分的理由.
func ComputeSomeValues(_ value1: inout String, _ value2: inout Int){
value1 = "my great computation 1";
value2 = 123456;
}
Run Code Online (Sandbox Code Playgroud)
像这样称呼它
var val1: String = "";
var val2: Int = -1;
ComputeSomeValues(&val1, &val2);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63706 次 |
| 最近记录: |