【问题标题】:Why doesn't inout pass by reference?为什么 inout 不通过引用传递?
【发布时间】:2015-12-29 01:06:09
【问题描述】:

我正在做这样的事情:

someFunction(&myClass)

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

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

如果我在函数调用之后打印 myClass,我注意到数组仍然是未排序的。据我所知,Swift 通过副本传递值。但是我用inout的时候,不应该改成引用传递吗?

【问题讨论】:

  • 你能展示一个(小)完整、独立的例子吗?
  • 这正是它正在做的事情:stackoverflow.com/questions/30541244/…
  • 我发布了一些额外的代码。 @snowman4415 的回答是有道理的。我测试过,就是这样。我实际上是在对数组进行 sort()。
  • 另外请注意,如果您实际上是对一个类而不是数组进行排序,则不需要inout,因为inout 仅用于为someclass 分配一个新值,而不是就地修改它。相反,如果您在struct 上排序(可能),您可以将结果分配给inout 参数以获得所需的效果。
  • 如果您找到满意的答案,您可以标记答案吗?

标签: swift


【解决方案1】:

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

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

更多详情

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

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

编辑

正如 cmets 中所指出的,如果您想更改指针等,您仍然可以将 inout 与引用类型一起使用,但我试图阐明一般用例。

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

【讨论】:

  • "所以只有当你想从函数内部改变值类型时才需要 inout。"不正确,如果您想更改引用,则需要 inout 引用类型 - 即,如果您想将其更改为指向另一个对象。当然,所有引用类型都是“值类型”,其中唯一的值是引用,所以从技术上讲,你的陈述是正确的,但它只是一个微不足道的陈述,所以这可能不是你的意思。
  • @snowman4415:我测试过,就是这样。我实际上是在一个数组上做一个 sort() 。当我在函数调用之后和之外引用类时,看不到排序值。
  • @4thSpace 查看我的编辑。 sort 没有原地改变数组,需要重新赋值返回值。
  • 请将代码示例作为文本而不是图像。更适合复制代码供任何人尝试。
【解决方案2】:
猜你喜欢
  • 2021-05-12
  • 2015-03-24
  • 2019-05-10
  • 2016-03-31
  • 2015-06-18
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多