如何在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 + 1到r中 ,然后将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