我迅速有一系列按钮。每个按钮都有一个闭合。我试图在for循环中使用i作为每个闭包中的值。
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存储在LevelLoad变量中。但是,这不起作用,应用程序崩溃且LevelLoad标记为nil。我知道在Java中,必须将r变量声明为final才能起作用。在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也是如此。我描述的“解决方法”是您如何处理此问题(而不仅仅是“解决方法”)]
变量i
不会在闭包的主体中修改,因此在创建闭包时必须“复制”(请参阅“捕获值”)。相反,显然,编译器认为这i
是可修改的,尽管它在闭包之外,并且错误地得出结论认为需要“引用”。
要变通,请将引用移至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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句