我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。
通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递?
规则是:
类实例是 引用类型 (即, 您 对类实例的引用实际上是一个 指针 )
函数是参考类型
其他一切都是 价值类型 ; “其他所有内容”仅表示结构实例和枚举实例,因为这就是Swift中的全部内容。例如,数组和字符串是结构实例。正如newacct所指出的,您 可以 通过使用inout并获取地址 来 传递对其中之一的引用(作为函数参数)。但是类型本身就是一个值类型。
inout
引用类型对象在实践中很特殊,因为:
仅仅分配或传递给函数可以产生对同一对象的多个引用
即使对象本身是常量(let,无论是显式还是隐式),该对象本身都是可变的。
let
从对该对象的所有引用可以看出,对该对象的突变会影响该对象。
这些可能是危险,因此请注意。另一方面,传递引用类型显然是有效的,因为仅复制和传递了一个指针,这是微不足道的。
显然,传递值类型是“安全的”,let这意味着它所说的是:您不能通过let引用对结构实例或枚举实例进行突变。另一方面,通过单独复制值来实现安全性,不是吗?这是否会使传递值类型变得昂贵?
好吧,是的,不是。它并不像您想象的那样糟糕。正如Nate Cook所说,传递值类型 不一定 意味着要进行复制,因为let(显式或隐式)保证了不变性,因此无需复制任何内容。甚至突入var参考并不意味着事情 会 被复制,只有他们 可以 是如果需要的话(因为有一个突变)。该文档特别建议您不要扭曲您的内裤。
var