inout/var 参数与引用类型有什么区别吗?
Does inout/var parameter make any difference with reference type?
我知道 inout
对 值类型有何作用。
对于对象或任何其他 引用类型 ,在那种情况下该关键字是否有用途,而不是使用 var
?
代码示例:
private class MyClass {
private var testInt = 1
}
private func testParameterObject(var testClass: MyClass) {
testClass.testInt++
}
private var testClass: MyClass = MyClass()
testParameterObject(testClass)
testClass.testInt // output ~> 2
private func testInoutParameterObject(inout testClass: MyClass) {
testClass.testInt++
}
testClass.testInt = 1
testInoutParameterObject(&testClass) // what happens here?
testClass.testInt // output ~> 2
可以和参数列表中的var
关键字一样。
不同之处在于,当您将按引用参数作为 var
传递时,您可以自由更改传递的对象中 中可以更改的所有内容,但是您无法将对象更改为完全不同的对象。
下面是一个代码示例来说明这一点:
class MyClass {
private var testInt : Int
init(x : Int) {
testInt = x
}
}
func testInoutParameterObject(inout testClass: MyClass) {
testClass = MyClass(x:123)
}
var testClass = MyClass(x:321)
println(testClass.testInt)
testInoutParameterObject(&testClass)
println(testClass.testInt)
此处,testInoutParameterObject
中的代码将一个全新的 MyClass
对象设置到传递给它的 testClass
变量中。在 Objective-C 术语中,这大致对应于将指针传递给指针(两个星号)与传递指针(一个星号)。
它对所有类型做完全相同的事情。没有inout
,就是传值(不管类型)。这意味着将 (=
) 分配给函数内的参数对调用范围没有影响。对于 inout
,它是 pass-by-reference(无论类型如何)。这意味着将 (=
) 分配给函数内的参数与分配给调用范围内传递的变量具有相同的效果。
我知道 inout
对 值类型有何作用。
对于对象或任何其他 引用类型 ,在那种情况下该关键字是否有用途,而不是使用 var
?
代码示例:
private class MyClass {
private var testInt = 1
}
private func testParameterObject(var testClass: MyClass) {
testClass.testInt++
}
private var testClass: MyClass = MyClass()
testParameterObject(testClass)
testClass.testInt // output ~> 2
private func testInoutParameterObject(inout testClass: MyClass) {
testClass.testInt++
}
testClass.testInt = 1
testInoutParameterObject(&testClass) // what happens here?
testClass.testInt // output ~> 2
可以和参数列表中的var
关键字一样。
不同之处在于,当您将按引用参数作为 var
传递时,您可以自由更改传递的对象中 中可以更改的所有内容,但是您无法将对象更改为完全不同的对象。
下面是一个代码示例来说明这一点:
class MyClass {
private var testInt : Int
init(x : Int) {
testInt = x
}
}
func testInoutParameterObject(inout testClass: MyClass) {
testClass = MyClass(x:123)
}
var testClass = MyClass(x:321)
println(testClass.testInt)
testInoutParameterObject(&testClass)
println(testClass.testInt)
此处,testInoutParameterObject
中的代码将一个全新的 MyClass
对象设置到传递给它的 testClass
变量中。在 Objective-C 术语中,这大致对应于将指针传递给指针(两个星号)与传递指针(一个星号)。
它对所有类型做完全相同的事情。没有inout
,就是传值(不管类型)。这意味着将 (=
) 分配给函数内的参数对调用范围没有影响。对于 inout
,它是 pass-by-reference(无论类型如何)。这意味着将 (=
) 分配给函数内的参数与分配给调用范围内传递的变量具有相同的效果。