【问题标题】:inout Declarations for Type Decoration类型装饰的 inout 声明
【发布时间】:2016-07-20 10:46:30
【问题描述】:

根据 Swift 3 中 inout 的用法,我有一个问题。

据我了解,inout 使用起来非常昂贵。

还有一个问题,什么时候以及为什么使用inout 声明更好?

正则函数:

func double(input: Int)  {
    var input = input
    input = input * 2
}

inout 声明使用:

func double(input: inout Int) {
    input = input * 2
}

【问题讨论】:

  • inout is quite expensive operation for use 为什么这么说?
  • 我编辑我的答案。昂贵的来源是这个链接realm.io/news/appbuilders-daniel-steinberg-whats-new-swift-3。第0035节
  • 现在您已经编辑了:您的第一个示例什么都不做input 是一个副本。如果要修改原始文件,请使用带有 inout 的第二个示例。这不一样!
  • 所以它只是语法糖,可以修改输入属性而不重新分配?
  • 看看stackoverflow.com/a/34486250/1187415,它有一个引用和指向 Swift 参考的链接。 “简单变量”只是通过引用传递。

标签: swift swift3


【解决方案1】:

小心,这是一个经典的陷阱! :)

你的两个函数做的不是同一件事,所以一个并不比另一个“更好”。

你的第一个:

func double(input: Int)  {
    var input = input
    input = input * 2
}

什么都不做。

因为使用var input = input,您正在制作输入值的副本,所以当您执行input = input * 2 时,您只是在修改本地副本,并且由于您不返回它,所以它被丢弃,这个函数最终没有效果。

你的第二个:

func double(input: inout Int) {
    input = input * 2
}

做了一些事情:它修改了原始值,因为inout 是一种通过引用传递值的方式。无需复制并返回:变量本身,即您传递给函数的变量,将被更改。

注意:我建议你阅读 Martin R 的优秀链接,其中 inout 解释得很好:https://stackoverflow.com/a/34486250/1187415

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 2023-01-28
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2021-01-04
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多