为什么不通过引用传递?

时间:2015-10-01 04:58:52

标签: swift

我正在做这样的事情:

someFunction(&myClass)

其中someFunction对myClass上的数组进行排序。

someFunction(inout someclass:ClassA) {
 someClass.sort({$0.price > $1.price})  
}

如果我在函数调用后打印myClass,我注意到数组仍未排序。据我所知,Swift通过复制传递值。但是当我使用inout时,它不应该改为通过引用传递吗?

2 个答案:

答案 0 :(得分:5)

这是因为类实例和函数是引用类型。 Ints,结构和其他一切都是值类型。将引用类型作为参数传递给函数时,您已经将引用该实例。当您将值类型作为参数传递时,该函数会获取该变量的副本(默认情况下),因此inout 通常(请参阅编辑)只有在您想要更改时才需要从函数内部输入。

在没有&inout的情况下更改类实例:

enter image description here

更多详情

当您创建引用类型var t = myClass()时,您实际上正在创建一个变量t,它是指向内存中myClass实例的指针。通过在引用类型前面使用&符号&t,您实际上是在说“给我指向myClass实例的指针

有关参考与价值类型的更多信息:https://stackoverflow.com/a/27366050/580487

修改

正如评论中指出的那样,如果你想改变一个指针等,你仍然可以使用inout和引用类型,但我试图揭示一般用例。

下面是对函数内部数组进行排序的示例:

enter image description here

答案 1 :(得分:0)