Skip to content

Latest commit

 

History

History
55 lines (41 loc) · 2.82 KB

6.4 inout参数和可变方法(inout parameter and mutating function).md

File metadata and controls

55 lines (41 loc) · 2.82 KB

第六章:函数(function)

6.4 inout参数和可变方法(inout parameter and mutating function)

知识点: inout 关键字: 一般用来修饰函数的参数 就是让函数的参数变得可变(swift 中方法的参数默认都是 let 不可变的)
  // 给originNum参数加increment   ❌
  func addNumber(originNum: Int, increment: Int) {
    // 这里会报错:Left side of mutating operator isn't mutable: 'originNum' is a 'let' constant
    originNum += increment
  }

  // 使用了inout 关键字   ✅
  func addNumber(originNum: inout Int, increment: Int) {
   originNum += increment
  }

  // 方法调用 在value参数前有一个&符号
  var value = 50
  addNumber(originNum: &value, increment: 10)
  print(value) // value = 60

inout做的事情就是把一个值传递给函数,函数可以改变这个值,然后将原来的值替换,并传递出来。 它并不是传递引用

什么样的表达式可以当作inout参数去传递?

先来弄懂两个c++中的概念。 lvalve (变量)和 rvalve (不是变量) 如array[2] = 4 lvalue = rvalue

  • lvalue估计来源于left value。 位置处于左边。就是可以修改的值。
  • rvalue估计来源于right value。处于赋值语句右边,是只读的不可修改的值。 资料来源:关于lvalve 和 rvalve 感兴趣的同学可以看看。 inout参数,只能传递lvalve给它。因为不可能对一个rvalve进行改变。
注: 每个lvalve前面需要加上&符号将它传入(swift中的自动补全会帮我们加上& 😄)

Alert text inout的基本使用

知识点:只读属性(只有get方法)无法作用于inout参数

tips:swift文档指出 我们不应该依赖inout这个行为

嵌套函数和inout


可以在嵌套函数中使用一个inout参数 Alert text

注: 我们不能让这里的inout参数逃逸@escaping (原因:inout的值会在函数返回之前赋值回去,逃逸会增加inout参数的生命周期,如果延时返回回去赋值,原来的值不存在了,就妥妥的不安全啊~)

@escaping 的用法后面会讲。 你急的话可以先自己百度。默认大家都很优秀,知道是什么用法!

&不意味inout的情况


&除了讲变量传递给inout, 还可以将变量转化为不安全的指针Alert text 这里的&使用就不是inout语义了,是将变量转化成了不安全的指针。