Ios Inout函数与返回传入参数的函数
在Swift中,何时使用inout函数与修改单个参数并返回修改后的参数的函数相比更可取 这可能是一个逐案的场景,我觉得使用返回传递参数的函数在调用中更显式,因此更可读,但我不确定复制对象对内存的影响,例如 以以下为例:Ios Inout函数与返回传入参数的函数,ios,swift,pass-by-reference,Ios,Swift,Pass By Reference,在Swift中,何时使用inout函数与修改单个参数并返回修改后的参数的函数相比更可取 这可能是一个逐案的场景,我觉得使用返回传递参数的函数在调用中更显式,因此更可读,但我不确定复制对象对内存的影响,例如 以以下为例: func addConstraints(to label: UILabel) -> UILabel { let constrainedLabel = label //Add all constraints to constrained label return
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
}
或
仅引用类型(此处的类
UILabel
)不需要inout
使用第一种方法而不必复制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"
标准库中已经有这样一个函数:。在普通Swift使用中,几乎不需要inout
参数
当然,在您给出的第一种情况下,您不需要inout
参数或返回值,因为UILabel是一个类,它是引用类型
在第二种情况下,在所有其他条件相同的情况下,第一种方法更好:
var num = 5
num = addOne(to: num)
inout
示例具有完全相同的效果-它用不同的Int替换num
的值-绝对没有增益,危险增加。在这些示例中,两者都不需要UILabel
是一种引用类型。不过,在更一般的上下文中,您应该尽量避免使用inout
参数,而是尽可能多地使用没有副作用的纯函数。您不能将1添加到num
。它是一个let
常量。您的第二个示例甚至不会编译,因为inout
参数不能声明为不可变,并且在向函数传递inout
参数时,还需要使用&
符号。此外,函数中没有返回值,因此您的函数签名也有缺陷。但是,无论如何,您不应该使用这种方法,只需返回新的递增值并将其存储在新变量中,除非您绝对需要,否则不要使用inout
。要补充的是:当您真正需要使用inout
时,只有在您编写(比如+=
,-=
,*=
,/=
等等)。即使这样,你也不需要定义它们,因为它们总是语法上的糖。
let label = UILabel()
label.text = "Hello"
print(label.text!) //"Hello"
label.text = "world"
print(label.text!) //"world"
var num = 5
num = addOne(to: num)