swift - 类型修饰的 inout 声明

标签 swift swift3

我有一个关于 Swift 3 中 inout 用法的问题。

据我所知,inout 的使用成本非常高。

问题是什么时候以及为什么使用 inout 声明更好?

常规函数:

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

inout声明使用:

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

最佳答案

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

您的两个功能没有做同样的事情,所以一个并不比另一个“更好”。

你的第一个:

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 .

关于swift - 类型修饰的 inout 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38479134/

相关文章:

ios - 体系结构 x86_64 iOS swift 的 undefined symbol

ios - 在 Swift 中创建一个应用程序生命周期对象(不可能被释放)

swift - UICollectionViewCell 在选择时不改变颜色

ios - 将对象保存到 json 文件

iOS : Firebase notification not working for user segment

函数调用的快速返回结果

ios - XCode6 Beta 中的编译器警告 - “Shorthand External Parameter Names”

ios - 使用泛型和嵌套函数时出现 Swift 编译器错误,由于信号 : Segmentation fault: 11,命令失败

ios - 在曲线形状图层上绘制边框

swift - 反向地理编码位置 : more accuracy than range