Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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
Swift2 Using inout关键字:是通过引用或通过复制传入复制输出传递的参数(/call by value result)_Swift2_Inout - Fatal编程技术网

Swift2 Using inout关键字:是通过引用或通过复制传入复制输出传递的参数(/call by value result)

Swift2 Using inout关键字:是通过引用或通过复制传入复制输出传递的参数(/call by value result),swift2,inout,Swift2,Inout,问题:基于以下信息和讨论:inout参数是通过引用传递还是通过复制传入复制 基于以下SO线程,通过引用传递由inout关键字标记的函数参数: 我们注意到,最上面的两个线程是Swift 2.0之前的线程;我在这里找不到任何关于这个主题的更新的讨论(除了第三个线程链接) 然而,根据苹果的文档(据我所知),由inout关键字标记的函数参数是通过copy-in-copy-out(或call-by-value-result)传递的 : 输入输出参数的传递方式如下: 调用函数时,将复制参数

问题:基于以下信息和讨论:
inout
参数是通过引用传递还是通过复制传入复制


基于以下SO线程,通过引用传递由
inout
关键字标记的函数参数:

我们注意到,最上面的两个线程是Swift 2.0之前的线程;我在这里找不到任何关于这个主题的更新的讨论(除了第三个线程链接)


然而,根据苹果的文档(据我所知),由
inout
关键字标记的函数参数是通过copy-in-copy-out(或call-by-value-result)传递的

  • :
输入输出参数的传递方式如下:

调用函数时,将复制参数的值。在里面 函数体,副本已修改。当函数 返回,将副本的值指定给原始参数。这 这种行为称为输入复制输出或按值调用结果

  • :
。。。通过将inout关键字放置在 开始其参数定义。输入输出参数有一个值 传递给函数的,由函数修改, 并且从函数中传回以替换原始 值


现在,以我自己的例子来研究这一点:

struct MyStruct {
    private var myInt: Int

    mutating func increaseMyInt() {
        myInt++
    }

    func printMyInt() {
        print(String(myInt))
    }

    init(int: Int) {
        myInt = int
    }
}

class MyClass {
    var myStruct: MyStruct

    init(int: Int) {
        myStruct = MyStruct(int: 1)
    }

    func printMyStructsInt() {
        print(String(myStruct.printMyInt()))
    }
}

func myInOutFunc(inout myLocalStruct: MyStruct, myClass: MyClass) -> Int {
    myClass.printMyStructsInt() // prints "1", OK
    myLocalStruct.increaseMyInt()
    myClass.printMyStructsInt() // prints "2": so myStruct is not a copy here?
    myLocalStruct.increaseMyInt()

    return 0
        // according to Apple's doc, shouldn't myStruct member of myClass get
        // assigned (copy of) value of myLocalStruct at this point, and not
        // prior to this?
}

var a = MyClass(int: 1)

a.printMyStructsInt() // prints "1", OK
myInOutFunc(&a.myStruct, myClass: a)
a.printMyStructsInt() // prints "3", OK
此示例意味着
inout
参数确实是通过引用传递的(如上面两个链接的SO线程所述)。由于我们在inout参数前面加了一个符号(
&
),这确实“感觉”合乎逻辑

为了尽我最大的努力确保我的示例具有代表性——因为这里
inout
参数
myLocalStruct
作为类属性发送——我还确保
myLocalStruct
由于是类属性,所以没有得到一些“幕后”引用:

// ... add to bottom of the code above

func testSendStructAsPublicClassProperty(var myLocalStruct: MyStruct) {
    myLocalStruct.increaseMyInt()
}

// test that sending class property doesn't "reference" things up
a.printMyStructsInt() // prints "3"
testSendStructAsPublicClassProperty(a.myStruct)
a.printMyStructsInt() // prints "3", OK (only copy of class property is sent)
好的,
myLocalStruct
在本例中真正是本地函数,因此通过值传递(引擎盖后面没有引用)


结果:鉴于上述情况,
inout
参数是否通过引用传递

我有两个可能的后续问题:

  • 我是否曲解了苹果语言文档中的
    inout
    描述,它是否可以解释为“通过引用传递”
  • 或者,我的例子仍然不能代表这个案例吗

  • 语言参考中的下两段对其进行了更详细的描述:

    输入输出参数

    这种行为称为“输入复制输出”或“按值调用结果”。对于 例如,当计算属性或具有观察者的属性 作为in-out参数传递,其getter作为 函数调用及其setter作为函数返回的一部分被调用

    作为优化,当参数是存储在物理位置的值时 内存中的地址,内部和外部都使用相同的内存位置 在功能体之外优化的行为称为callby 参考;它满足中副本的所有要求 复制模型,同时消除复制的开销不依赖于 论抄入抄出与呼叫方式的行为差异 参考资料。


    所以这实际上是“参考传递”

    啊,我略过了那部分,谢谢!如果可能的话,也许你可以在上面引文的最后一句加粗?这真是一句妙语(根据我问题的上下文:)