美文网首页征服SwiftiOS必须Swiftios
Swift 关键字 inout - 让值类型以引用方式传递

Swift 关键字 inout - 让值类型以引用方式传递

作者: JinyaMax | 来源:发表于2016-04-28 22:24 被阅读3642次

    两种参数传递方式

    值类型

    传递的是参数的一个副本,这样在调用参数的过程中不会影响原始数据

    引用类型

    把参数本身引用(内存地址)传递过去,在调用的过程会影响原始数据

    在 Swift 众多数据类型中,只有 class 是引用类型,
    其余的如 Int、Float、Bool、Character、Array、Set、enum、struct全都是类型.

    让值类型以引用方式传递

    有时候我们需要通过一个函数改变函数外面变量的值(将一个值类型参数以引用方式传递),
    这时,Swift 提供的 inout 关键字就可以实现。
    举例:

    /// 以下代码已更新到 Swift 4.0
    var value = 50
    print(value)  // 此时value值为50
    
    func increment(_ value: inout Int, _ length: Int = 10) {
        value += length
    }
    
    increment(&value)
    print(value)  // 此时 value 值为60,成功改变了函数外部变量 value 的值
    

    即:声明函数时,在参数类型前面用 inout 修饰,函数内部实现改变外部参数
    传入参数时(调用函数时),在变量名字前面用 & 符号修饰表示,表明这个变量在参数内部是可以被改变的(可将改变传递到原始数据)

    注意

    1. inout 修饰的参数是不能有默认值的(例子中 length = 10被赋予默认值),有范围的参数集合也不能被修饰;
    2. 一个参数一旦被 inout 修饰,就不能再被 var 和 let 修饰了。

    相关文章

      网友评论

      • Rdxer:“inout在写法上与C语言传递地址的写法十分类似,在调用函数传入参数是带有前缀&,就好像取地址传进去了一样,实则不然。” 博主看看这个 http://ios.jobbole.com/92852/
      • 独白melody:那copy算不算是引用类型以值类型传递:flushed:
      • wqching:Swift 3 中的语法

        var value = 50
        print(value) // 此时value值为50

        func increment(value: inout Int, length: Int = 10) {
        value += length
        }

        increment(value: &value)
        print(value)
        九月的天好清爽:@陈雨尘 You're right
        陈雨尘:是的 这个是最新的方法
      • Jon1993:让值类型以引用方式传递,这个解释很到位,一下就明白了
        viccowang:确实.:smile:

      本文标题:Swift 关键字 inout - 让值类型以引用方式传递

      本文链接:https://www.haomeiwen.com/subject/pkphrttx.html