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

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

最佳答案

Swift中的事物类型

规则是:

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

  • 引用类型对您意味着什么

    引用类型对象在实践中很特殊,因为:
  • 仅仅赋值或传递给函数可以对同一对象
  • 产生多个引用
  • 即使对对象的引用是一个常量(let,显式或隐式),对象本身也是可变的。
  • 从对该对象的所有引用可以看出,该对象的突变会影响该对象。

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

    值类型对您意味着什么

    显然,传递值类型是“安全的”,而let表示其含义:您无法通过let引用对结构实例或枚举实例进行突变。另一方面,通过单独复制值来实现安全性,不是吗?这是否会使传递值类型变得昂贵?

    好吧,是的,不是。它并不像您想象的那样糟糕。就像Nate Cook所说的那样,传递值类型不一定意味着要进行复制,因为let(显式或隐式)可以保证不变性,因此无需复制任何内容。即使传递到var引用也并不意味着将要复制的内容,只是在必要时可以复制它们(因为存在突变)。该文档特别建议您不要扭曲您的内裤。

    关于swift - 是通过值快速传递还是通过引用快速传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27364117/

    10-09 21:26
    查看更多