Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
Swift 初始化闭包内的局部变量_Swift - Fatal编程技术网

Swift 初始化闭包内的局部变量

Swift 初始化闭包内的局部变量,swift,Swift,可以在闭包中初始化变量吗?具体而言,以下代码给出了一个错误: func doSomething(todo: (Void -> Void)) -> Void { todo() } var i: Int doSomething( { i = 3} ) print(i) 因为i在初始化之前被捕获。当然,我总是可以对变量使用默认初始化并跳过,这在大多数情况下是一种微优化,但我想知道 编辑: 最后,我使用了一个隐式展开的可选var I:Int,, 感谢@Laffen和@dfri为

可以在闭包中初始化变量吗?具体而言,以下代码给出了一个错误:

func doSomething(todo: (Void -> Void)) -> Void {
    todo()
}

var i: Int
doSomething( { i = 3} )
print(i)
因为
i
在初始化之前被捕获。当然,我总是可以对变量使用默认初始化并跳过,这在大多数情况下是一种微优化,但我想知道


编辑:

最后,我使用了一个隐式展开的可选
var I:Int,,

感谢@Laffen和@dfri为我指明了正确的方向。在大多数情况下,使用可选项应该是最好的方法。

如果没有为初始化设置默认值,则应附加
以使其成为可选项

var i: Int?

func someFunc(){
    i = 1
}
注意:为了提高本答案的可读性以及@dfri的评论,我在答案中加入了评论:


也许值得一提的是,
i
现在是一个隐式展开的可选选项,因此,
i
可以获取一个值
nil
,在尝试访问
nil
之后,带值的
i
将不会提示编译时警告,但会产生运行时异常。例如,
i=nil
<代码>打印(i)
。对于这种情况,我发现让
I
成为一个“常规”选项更安全,在这种情况下,编译器将提示您展开(您可以以安全的方式而不是隐式地使用强制展开
默认情况下:例如
var I:Int?
打印(I???“nil”)
,或者安全地打印
“nil”
如果未打开包装


如果没有为初始化设置默认值,则应附加
,使其成为可选值

var i: Int?

func someFunc(){
    i = 1
}
注意:为了提高本答案的可读性以及@dfri的评论,我在答案中加入了评论:


也许值得一提的是,
i
现在是一个隐式展开的可选选项,因此,
i
可以获取一个值
nil
,在尝试访问
nil
之后,带值的
i
将不会提示编译时警告,但会产生运行时异常。例如,
i=nil
<代码>打印(i)。对于这种情况,我发现让
I
成为一个“常规”选项更安全,在这种情况下,编译器将提示您展开(您可以以安全的方式而不是隐式地使用强制展开
默认情况下:例如
var I:Int?
打印(I???“nil”)
,或者安全地打印
“nil”
如果未打开包装

如果您将打印(i)移动到封口内,则它会起作用

func doSomething(todo: (Void -> Void)) -> Void {
    todo()
    print(i)
}

var i: Int
doSomething( { i = 3} )
如果该值未在闭包外部发生突变,Swift将复制该值,因此在剂量仪外部引用的i与剂量仪内部引用的i不同。

如果将打印(i)移动到闭包内部,则其工作正常

func doSomething(todo: (Void -> Void)) -> Void {
    todo()
    print(i)
}

var i: Int
doSomething( { i = 3} )

如果该值未在闭包外发生突变,Swift将复制该值,因此在剂量仪外引用的i与剂量仪内引用的i不同。

错误是关于未初始化的
i
-因此初始化它!如果您将其声明为
var i:Int=0
,您的示例将打印3。在我看来,使用
var i:Int=0
声明它相当于使用
0
的默认初始化。我的问题不是“我该如何消除这个错误”。你收到了什么错误?@HBu:显然不是“同等的”。Swift中没有默认的初始化。你要做的是声明变量的类型,而不是初始化它。通常在这种情况下——声明一个变量并在稍后阶段初始化它,比如通过闭包——使用可选变量。就其本身而言,这并不完全相同,因为在声明时,选项将具有值
nil
,但至少值得一提。(
var i:Int?
print(i???“nil”)
)错误是关于未初始化的
i
,因此请初始化它!如果您将其声明为
var i:Int=0
,您的示例将打印3。在我看来,使用
var i:Int=0
声明它相当于使用
0
的默认初始化。我的问题不是“我该如何消除这个错误”。你收到了什么错误?@HBu:显然不是“同等的”。Swift中没有默认的初始化。你要做的是声明变量的类型,而不是初始化它。通常在这种情况下——声明一个变量并在稍后阶段初始化它,比如通过闭包——使用可选变量。就其本身而言,这并不完全相同,因为在声明时,选项将具有值
nil
,但至少值得一提。(
var i:Int?
print(i???“nil”)
)也许值得一提的是,
i
现在是一个隐式展开的可选选项,因此
i
可以获取一个值
nil
,在尝试访问
nil
i
后,将不会提示编译时警告,但是,会产生运行时异常。例如,
i=nil
<代码>打印(i)。对于这种情况,我发现让
I
成为一个“常规”选项更安全,在这种情况下,编译器将提示您展开(您可以以安全的方式而不是隐式地使用强制展开
默认情况下:例如
var I:Int?
打印(I???“nil”)
),或者安全地打印
“nil”
如果不展开。也许值得一提的是,
i
现在是一个隐式展开的可选选项,因此,
i
可以获取一个值
nil
,在尝试访问
nil
i
后,将不会提示编译时警告,但会产生运行时异常。例如,
i=nil
<代码>打印(i)。对于这种情况,我发现让
I
成为“常规”选项更安全