小编典典

是通过值快速传递还是通过引用快速传递

swift

我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。

通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递?


阅读 259

收藏
2020-07-07

共1个答案

小编典典

Swift中的事物类型

规则是:

  • 类实例是 引用类型 (即, 对类实例的引用实际上是一个 指针

  • 函数是参考类型

  • 其他一切都是 价值类型 ; “其他所有内容”仅表示结构实例和枚举实例,因为这就是Swift中的全部内容。例如,数组和字符串是结构实例。正如newacct所指出的,您 可以 通过使用inout并获取地址 传递对其中之一的引用(作为函数参数)。但是类型本身就是一个值类型。

引用类型对您意味着什么

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

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

  • 即使对象本身是常量(let,无论是显式还是隐式),该对象本身都是可变的。

  • 从对该对象的所有引用可以看出,对该对象的突变会影响该对象。

这些可能是危险,因此请注意。另一方面,传递引用类型显然是有效的,因为仅复制和传递了一个指针,这是微不足道的。

值类型对您意味着什么

显然,传递值类型是“安全的”,let这意味着它所说的是:您不能通过let引用对结构实例或枚举实例进行突变。另一方面,通过单独复制值来实现安全性,不是吗?这是否会使传递值类型变得昂贵?

好吧,是的,不是。它并不像您想象的那样糟糕。正如Nate Cook所说,传递值类型 不一定
意味着要进行复制,因为let(显式或隐式)保证了不变性,因此无需复制任何内容。甚至突入var参考并不意味着事情 被复制,只有他们 可以
是如果需要的话(因为有一个突变)。该文档特别建议您不要扭曲您的内裤。

2020-07-07