Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Inout函数与返回传入参数的函数_Ios_Swift_Pass By Reference - Fatal编程技术网

Ios 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

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


仅引用类型(此处的类
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)