Inout函数与返回传入参数的函数

时间:2018-09-28 15:01:04

标签: ios swift pass-by-reference

在Swift中,什么时候最好使用inout函数而不是修改单个参数并返回修改后的参数的函数?

这可能是一个个案,我觉得使用一个返回传递参数的函数在调用中更加显式,因此更具可读性,但是我不确定复制对象的内存影响,因为例子。

采用以下示例:

func addConstraints(to label: UILabel) -> UILabel {
  let constrainedLabel = label
  //Add all constraints to constrained label
   return constrainedLabel
}

这有利于:

func addConstraints(to label: inout UILabel){
   //Add constraints
}

非常感谢,如果已经回答了这个问题,或者它太广泛了。

编辑,因为我显然使用了最糟糕的示例:

有什么更好的了:

let num = 5
num = addOne(to: num)

func addOne(to num: Int) -> Int {
 return num + 1
}

let num = 5
addOne(to: num)

func addOne(to num: inout Int) -> Int {
  num + 1
}

3 个答案:

答案 0 :(得分:4)

在普通的Swift使用中,您几乎从不需要一个inout参数。

在第一种情况下 当然,您不需要inout参数返回值,因为UILabel是一个类,因此是引用类型

在第二种情况下,在所有其他条件相同的情况下,第一种方法更好:

var num = 5
num = addOne(to: num)

inout示例具有完全相同的效果-它用不同的Int替换num的值-绝对没有收益,而且危险增加。

答案 1 :(得分:1)

使用第一种方法,而不必复制UILabel

func addConstraints(to label: UILabel){
  //Add all constraints to label
}

即使实例是常量(let),也可以更改其实例的属性。

就像您可以更改let标签的文本一样:

let label = UILabel()

label.text = "Hello"
print(label.text!)    //"Hello"

label.text = "world"

print(label.text!)    //"world"

标准库addConstraints(_:)中已经存在执行此功能的功能。

答案 2 :(得分:0)

您不需要inout作为参考类型(此处为UILabel的类)

func addConstraints(to label: UILabel) {

  // add constraints and they will be applied to the label
}