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
关键字标记的函数参数:
然而,根据苹果的文档(据我所知),由
inout
关键字标记的函数参数是通过copy-in-copy-out(或call-by-value-result)传递的
- :
- :
现在,以我自己的例子来研究这一点:
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 参考;它满足中副本的所有要求 复制模型,同时消除复制的开销不依赖于 论抄入抄出与呼叫方式的行为差异 参考资料。
所以这实际上是“参考传递”啊,我略过了那部分,谢谢!如果可能的话,也许你可以在上面引文的最后一句加粗?这真是一句妙语(根据我问题的上下文:)