在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
}
答案 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
}