是否可以在闭包中初始化变量?具体来说,以下代码给出了错误:
i
因为在初始化之前捕获了var i: Int!
。当然,我总是可以使用默认初始化变量和跳过大部分时间进行微优化,但我很想知道。
编辑:
最后,我带着一个隐含的未包装的可选DataGridView
,
感谢@Laffen和@dfri指出我正确的方向。在大多数情况下,使用可选项应该是最好的方法。
答案 0 :(得分:2)
如果没有为初始化设置默认值,则应附加?
以使其成为可选项。
var i: Int?
func someFunc(){
i = 1
}
注意:为了提高此答案的可读性以及@dfri的评论,我在答案中包含了评论:
或许值得一提的是
i
现在是一个隐式解包的可选项,因此i
可以取值nil
,然后尝试访问nil
- 值{ {1}}不会提示编译时警告,但会产生运行时异常。例如,i
......i=nil
。对于这种情况,我发现让print(i)
成为“常规”可选更安全,在这种情况下编译器将提示您进行解包(并且您可以以安全的方式执行此操作,而不是隐式使用强制解包{{1默认情况下:例如i
....!
,或者如果没有打开则安全打印var i: Int?
。
答案 1 :(得分:0)
如果你将印花(i)移到封口内,那就可以了。
func doSomething(todo: (Void -> Void)) -> Void {
todo()
print(i)
}
var i: Int
doSomething( { i = 3} )
如果值没有在闭包之外变异,那么Swift将复制该值,因此doSomething之外引用的i与doSomething中的不同。