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
成为“常规”选项更安全