在闭包内初始化局部变量

时间:2016-02-10 08:43:00

标签: swift

是否可以在闭包中初始化变量?具体来说,以下代码给出了错误:

i

因为在初始化之前捕获了var i: Int!。当然,我总是可以使用默认初始化变量和跳过大部分时间进行微优化,但我很想知道。

编辑:

最后,我带着一个隐含的未包装的可选DataGridView, 感谢@Laffen和@dfri指出我正确的方向。在大多数情况下,使用可选项应该是最好的方法。

2 个答案:

答案 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中的不同。