Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 有没有办法确定传入的变量是引用类型还是值类型?_Swift - Fatal编程技术网

Swift 有没有办法确定传入的变量是引用类型还是值类型?

Swift 有没有办法确定传入的变量是引用类型还是值类型?,swift,Swift,在Swift中,是否有方法通过代码确定传入的变量是引用类型还是值类型 例如,元组是值类型还是引用类型?afaik,要通过引用传递,需要在参数定义前面添加inout关键字。所有其他参数都是常量,除非前缀为var关键字 “默认情况下,函数参数是常量。尝试在函数体中更改函数参数的值会导致编译时错误。这意味着您不能错误地更改参数的值。” 而且 如上所述,变量参数只能在函数本身内更改。如果希望函数修改参数值,并且希望这些更改在函数调用结束后保持不变,请将该参数定义为in-out参数 摘自:苹果公司《Swi

在Swift中,是否有方法通过代码确定传入的变量是引用类型还是值类型


例如,元组是值类型还是引用类型?

afaik,要通过引用传递,需要在参数定义前面添加
inout
关键字。所有其他参数都是常量,除非前缀为
var
关键字

“默认情况下,函数参数是常量。尝试在函数体中更改函数参数的值会导致编译时错误。这意味着您不能错误地更改参数的值。”

而且

如上所述,变量参数只能在函数本身内更改。如果希望函数修改参数值,并且希望这些更改在函数调用结束后保持不变,请将该参数定义为in-out参数

摘自:苹果公司《Swift编程语言》。iBooks

除以下内容外,所有内容都是值类型:

  • 类的实例

  • 函数

  • 一个数组(以一种奇怪的方式工作;它通过引用传递,但是如果它是可变的,并且项目的数量发生了变化,那么它可以与其他化身解除绑定)

简单的代码测试方法就是分配两个不同的
var
名称,更改一个,看看它们是否仍然相等。例如:

    var tuple1 = (1,2)
    var tuple2 = tuple1
    tuple1.1 = 3
    println(tuple1)
    println(tuple2)
它们是不同的,证明元组是通过值传递的。但是:

它们是相同的,证明数组是通过引用传递的

编辑:


但是在Swift的beta3中,数组的这种异常行为被撤销,只有类实例和函数通过引用传递。现在所有其他内容都按值传递。

我不是指按引用传递。我的意思是,如果某个对象是引用类型而不是值类型(比如数组、字典和结构都是值类型),那么就会误解这个问题。我认为除了类和closure之外,所有的东西都是值类型。根据苹果的文档,数组是值类型。@Boon数组是
struct
。但是它被实现为引用类型(比如C数组/指针)。@BryanChen Doc这样说:“整数、浮点数、布尔值、字符串、数组和字典都是值类型,并且在幕后被实现为结构。”它的复制行为可能不同于标准值类型,因为它只在其大小更改时复制,但它不是引用类型只是因为这种差异,不是吗?@matt您的评论根本没有建设性。这取决于您如何定义引用类型。就像有人说的,
NSArray*
是引用类型。但指针可以归类为值类型,因为指针本身是按值传递的。swift数组也是如此。它是按值传递的,但复制的只是一个指针(某种类型)。内容是按引用传递的。您如何定义“引用类型”和“值类型”?@newacct值类型在var/let声明时被复制,或者在传递给函数时,引用类型不会被复制。所有类型都被复制。在Swift中,一切都是按值分配和按值传递的,除非参数是
inout
。对于引用类型,该值是一个引用(指针),这就是复制的内容。但是类型可以是复合的,并且包含指针和非指针组件。那么您怎么称呼它?@newacct Swift在内部不使用指针作为引用类型。您认为“引用”类型是什么意思?引用=指针。你可以随便叫它什么。
    var arr1 = [1,2]
    var arr2 = arr1
    arr1[1] = 3
    println(arr1)
    println(arr2)