【问题标题】:How to pass reference types by value?如何按值传递引用类型?
【发布时间】:2015-04-02 08:34:36
【问题描述】:

我在几分钟前just started a question 了解到,swift 中的类实例是引用类型。但是,当我询问如何将实例作为副本传递时,或者只是在函数中创建副本时,似乎没有人确定。所以我的问题是:

是否可以通过值将类对象传递给函数? 如果是,该怎么做,如果不是,那我该如何处理副本?

【问题讨论】:

  • 也许你可以使用 Struct,通过值传递对象

标签: ios swift


【解决方案1】:

在 Swift 中不能按值传递类对象。更重要的是,没有制作对象副本的通用方法,因此您需要提供例如自己适当的初始化器。

【讨论】:

  • 我想你说的是 NSCopying 和 copyWithZone?
  • @Samir 我说的是初始化器,它具有与参数相同的类对象。
【解决方案2】:

值对象和引用对象有不同的用途。询问如何按值传递引用对象是绝对没有意义的。然而,很多时候你会传递不可变对象,这意味着对对象的引用就是的值。

顺便说一句:您的意思不是“类对象”。你的意思是“类的实例”。在 Objective-C 中,类本身就是对象。例如,您将分配消息发送到类对象。

【讨论】:

  • 我来自 c++,MyClass foo = MyClass()被称为类对象,所以是的,它是一个实例。但是,如果我将 foo 传递给一个函数,如果我不使用引用 (&),它将是该函数内部的一个副本(如果有一个副本构造函数可用)。也许这让我想问的更清楚。无论如何,谢谢你说清楚
【解决方案3】:

如何按值传递引用类型?

这个问题的答案是你只需按价值传递它。它对引用类型和值类型的工作方式完全相同。任何在 Swift 中没有标记为inout 的参数都是传值。

引用类型变量的值是一个reference,它指向一个对象。当您按值传递引用时,接收函数会收到此引用的副本,该副本指向同一个对象。

在进一步阅读您的问题后,您似乎根本没有询问引用类型的传递。相反,您是在询问对象的复制。当您编写“引用类型”时,您真正的意思是类似于“对象类型”,其值为对象,当按值传递时会产生对象的副本。

Swift 没有“对象类型”;就像 Objective-C 和 Java 没有“对象类型”一样。不可能有一个值“是一个对象”的变量;您只能拥有一个变量,其值是“指向对象”的引用。您可以通过这些引用来操作对象。语言中没有语法可以“取消引用”对其指向的对象的引用。

【讨论】:

  • 嗯,这就是我正在寻找的答案。你的最后一句话说得很清楚。但是我根本没有使用“参考类型”,只是对其进行了编辑。但是现在 Swift 没有“对象类型”很好,我刚从 c++ 世界出来,也许这就是为什么我只是误解了对象的事情
猜你喜欢
  • 2023-04-09
  • 2019-09-27
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2014-03-03
  • 2013-04-12
  • 2012-01-16
  • 2012-10-14
相关资源
最近更新 更多