如何在swift中使用闭包?

我有一个快速buttonarrays。 每个button都有一个closures。 我试图在for循环中使用我作为每个闭包中的值。

for(var i = 0; i < 30; i++){ chapterOnePanel.chapters[i].onClickListener = { (x:Float32, y:Float32) in let r = i + 1; self.ChapterLoad = "1"; self.LevelLoad = String(r); self.loadLevel = true; } } 

正如你所看到的,我正在循环中使用i来存储i + 1r中 ,然后将r存储在LevelLoadvariables中。 这不起作用,应用程序崩溃和LevelLoad被标记为零。 我知道在Java中,你必须声明rvariables作为最终的工作。 有没有办法在Swift中做到这一点?

下面是GoZoner提供的答案。

  for(var i = 0; i < 30; i++){ let r = i + 1; chapterOnePanel.chapters[i].onClickListener = { (x:Float32, y:Float32) in self.ChapterLoad = "1"; self.LevelLoad = String(r); self.loadLevel = true; } } 

这是一个错误:

 var data : [(Int) -> ()] = [] for (var i = 0; i < 5; i++) { data.append { (j:Int) in println (j + i) } } 9> data[0](10) 15 // should be 10 

[编辑:不是一个错误; 这是一些语言的方式,也是Swift。 我所描述的“解决问题”是你如何处理这个问题(而不仅仅是“解决方法”)]

variablesi不是在闭包体中修改的,因此在创build闭包时必须“复制”(请参阅​​“ 捕获值 ”)。 相反,显然,编译器认为i是可修改的,尽pipe在closures之外,并且错误地得出结论:需要“引用”。

要解决这个问题,请将引用移至closures之外的错误捕获的i

 Welcome to Swift version 1.2. Type :help for assistance. 1> var data : [(Int) -> ()] = [] 2. 3. for (var i = 0; i < 5; i++) { 4. let r = i 5. data.append { (j:Int) in 6. println (j + r) 7. } 8. } data: [Int -> ()] = 5 values { [0] = ($__lldb_expr2`partial apply forwarder for reabstraction thunk helper from @callee_owned (@unowned Swift.Int) -> (@unowned ()) to @callee_owned (@in Swift.Int) -> (@out ()) at repl1.swift) ... [4] = ($__lldb_expr2`partial apply forwarder for reabstraction thunk helper from @callee_owned (@unowned Swift.Int) -> (@unowned ()) to @callee_owned (@in Swift.Int) -> (@out ()) at repl1.swift) } 9> data[0](10) 10 10> data[4](10) 14