【发布时间】:2015-04-02 08:34:36
【问题描述】:
我在几分钟前just started a question 了解到,swift 中的类实例是引用类型。但是,当我询问如何将实例作为副本传递时,或者只是在函数中创建副本时,似乎没有人确定。所以我的问题是:
是否可以通过值将类对象传递给函数? 如果是,该怎么做,如果不是,那我该如何处理副本?
【问题讨论】:
-
也许你可以使用 Struct,通过值传递对象
我在几分钟前just started a question 了解到,swift 中的类实例是引用类型。但是,当我询问如何将实例作为副本传递时,或者只是在函数中创建副本时,似乎没有人确定。所以我的问题是:
是否可以通过值将类对象传递给函数? 如果是,该怎么做,如果不是,那我该如何处理副本?
【问题讨论】:
在 Swift 中不能按值传递类对象。更重要的是,没有制作对象副本的通用方法,因此您需要提供例如自己适当的初始化器。
【讨论】:
值对象和引用对象有不同的用途。询问如何按值传递引用对象是绝对没有意义的。然而,很多时候你会传递不可变对象,这意味着对对象的引用就是的值。
顺便说一句:您的意思不是“类对象”。你的意思是“类的实例”。在 Objective-C 中,类本身就是对象。例如,您将分配消息发送到类对象。
【讨论】:
MyClass foo = MyClass()被称为类对象,所以是的,它是一个实例。但是,如果我将 foo 传递给一个函数,如果我不使用引用 (&),它将是该函数内部的一个副本(如果有一个副本构造函数可用)。也许这让我想问的更清楚。无论如何,谢谢你说清楚
如何按值传递引用类型?
这个问题的答案是你只需按价值传递它。它对引用类型和值类型的工作方式完全相同。任何在 Swift 中没有标记为inout 的参数都是传值。
引用类型变量的值是一个reference,它指向一个对象。当您按值传递引用时,接收函数会收到此引用的副本,该副本指向同一个对象。
在进一步阅读您的问题后,您似乎根本没有询问引用类型的传递。相反,您是在询问对象的复制。当您编写“引用类型”时,您真正的意思是类似于“对象类型”,其值为对象,当按值传递时会产生对象的副本。
Swift 没有“对象类型”;就像 Objective-C 和 Java 没有“对象类型”一样。不可能有一个值“是一个对象”的变量;您只能拥有一个变量,其值是“指向对象”的引用。您可以通过这些引用来操作对象。语言中没有语法可以“取消引用”对其指向的对象的引用。
【讨论】: