Reference inout/var参数是否与引用类型有任何区别?

Reference inout/var参数是否与引用类型有任何区别?,reference,swift2,parameter-passing,Reference,Swift2,Parameter Passing,我知道inout对值类型的作用 对于对象或任何其他引用类型,在这种情况下该关键字是否有用途,而不是使用var 代码示例: 它可能与参数列表中的var关键字相同。不同之处在于,当您将一个通过引用的参数作为var传递时,您可以自由地更改传递对象内部可以更改的所有内容,但无法将对象更改为完全不同的对象 下面是一个代码示例,说明了这一点: class MyClass { private var testInt : Int init(x : Int) { testInt =

我知道inout对值类型的作用

对于对象或任何其他引用类型,在这种情况下该关键字是否有用途,而不是使用
var

代码示例:
它可能与参数列表中的
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
,它是通过引用传递的(无论类型如何)。这意味着将(
=
)赋值给函数中的参数与赋值给调用范围中传递的变量具有相同的效果。

谢谢,这有点棘手,因为没有警告说将
var
参数设置为新对象根本不起任何作用。我只是监督了那件事。那么所有引用类型都是一样的?@ViktorLexington是的,引用类型也是一样的。严格地说,设置一个普通的
var
会做一些事情-它会在函数期间更改对象,就像Objective-C中的pass-by值可以让您在不更改调用方上下文的情况下更改参数一样。@dasblinkenlight除了上面提到的问题之外,还有一个很小的后续问题(其中inout允许您直接替换参数引用的对象实例),如果我在swift中将引用类型(object)作为标准参数类型传递(没有inout和var),我的假设是否正确,如果对象的属性被传递给的函数修改,则该更改将存在于函数范围之外?即,函数内部的ref类型更改将在函数外部看到(即使没有var/inout).correct?@Woodstock是。如果在函数内修改传入对象的属性,这些更改将在函数范围外可见。这是一种非常常见的模式;
inout
关键字只能在函数修改变量本身时使用(即,用另一个变量替换它引用的对象)@ViktorLexington:这不正是我说的吗?请具体说明你是否同意我的回答,如果不同意,你不同意哪一部分。@ViktorLexington:“将引用作为值传递也是按引用传递。”绝对不是。这是按值传递。没有
inout
总是按值传递。有
inout
总是按引用传递。这是真的,无论值类型或引用类型。@ViktorLexington:你不能“传递对象”因为对象在Swift中不是值。您可以对作为值的对象进行引用。如果我们没有
inout
&
,则Swift中的传递和赋值在语义上与Java中的传递和赋值相同(Java中也有值类型和引用类型).查看StackOverflow或Internet上的任何地方,Java总是被描述为仅传递值。@ViktorLexington:问题是“inout参数是否与引用类型有任何区别?”答案是,有一个区别,它与值类型的区别是完全相同的,即:按值传递与按引用传递。类型之间没有区别。这怎么不是问题的正确答案?@ViktorLexington:“它在语义上不同”它在语义上相同。“但它是按引用传递的”同样,它是按值传递的,语义上与Java相同,Java只是按值传递。
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)