当前位置: 首页 > 面试题库 >

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

子车峰
2023-03-14
问题内容

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

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


问题答案:

Swift中的事物类型

规则是:

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

  • 函数是参考类型

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

引用类型对您意味着什么

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

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

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

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

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

值类型对您意味着什么

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

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



 类似资料:
  • 问题内容: Go中的地图是否通过值或引用传递? 始终可以将函数定义为以下形式,但这是一个过大的杀伤力吗? 相同的返回值问题。我应该返回指向地图的指针,还是将地图作为值返回? 这样做的目的当然是避免不必要的数据复制。 问题答案: 在此线程中,您将找到答案: Golang:使用地图参考来访问地图 您不需要在地图上使用指针。 映射类型是引用类型,例如指针或切片[1] 如果需要更改会话,可以使用一个指针:

  • 问题内容: 在PHP中,可以通过在函数声明中的参数前面加上“&”号来通过引用传递函数参数,如下所示: 现在,我知道这 不是 为了提高性能 而 设计的,而是允许函数更改通常不在其范围内的变量。 取而代之的是,PHP似乎使用写时复制来避免在对象被更改之前复制对象(也许还有数组)。因此,对于不更改其参数的函数,效果应与您通过引用传递它们的效果相同。 但是,我想知道写时复制逻辑是否可能在传递引用时短路,并

  • 问题内容: Javascript是通过引用传递还是通过值传递?这是 Javascript中的 一个示例 :The Good Parts 。我对矩形函数的参数非常困惑。它实际上是,并在函数内部重新定义。没有原始参考。如果我从功能参数中删除它,则内部区域功能将无法访问它。 是关闭吗?但是没有函数返回。 问题答案: 基元按值传递,对象按“引用副本”传递。 具体来说,当您传递对象(或数组)时,您(无形中)

  • 问题内容: 以下代码使快速(3,3.1,4)编译器崩溃: 我可能天真地希望编译器将其推断为具有签名的Function Type ,之后,我可以这样称呼它: 我想我的问题是:显然,编译器应该执行除崩溃以外的其他操作,但是Swift目前应该支持这种语法吗? 问题答案: 如您所说,编译器永远不会崩溃;这确实是一个错误,已在此处提交。Swift团队成员Slava Pestov在其中说: 我们计划使MyPr

  • 问题内容: 前往游览的频道示例如下:https : //tour.golang.org/concurrency/2 通道c在求和函数中被修改,并且该函数终止后更改仍然存在。显然,c是通过引用传递的,但是没有创建指向c的指针。是否在go中通过引用隐式传递了通道? 问题答案: 从技术上讲,它们是被复制的,因为当您使用时 ,您是在堆上分配内容,因此从技术上讲,它是幕后的指针。但是指针类型没有公开,因此可

  • 问题内容: 如何通过通知发送数字和字符串… 并在接收器中接收值? 问题答案: 您可以将它们包装在或或自定义对象中。 例如: