如何快速在for循环中使用闭包?

新泽西州

我迅速有一系列按钮。每个按钮都有一个闭合。我试图在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;
            }
        }

如您所见,我在循环中使用ii + 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;
                    }
                }
GoZoner

这是一个错误:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在for-in循环中使用尾随闭包

来自分类Dev

如何快速使用可变参数闭包?

来自分类Dev

在循环中修复闭包

来自分类Dev

javascript-如何使用闭包将事件绑定到循环中的元素数组?

来自分类Dev

添加事件在循环中无法正常使用闭包

来自分类Dev

在 do while 循环中对 get 请求使用闭包

来自分类Dev

如何在PHP闭包中使用$ this?

来自分类Dev

如何在PHP闭包中使用$ this?

来自分类Dev

如何在闭包中使用 DispatchSemaphore

来自分类Dev

何时快速使用闭包?

来自分类Dev

在带有快速枚举的for循环中使用块的错误

来自分类Dev

在coffeescript中使用闭包

来自分类Dev

如何快速访问闭包内部的注释

来自分类Dev

如何在嵌套地图中使用闭包?

来自分类Dev

如何在PHP的闭包函数中使用变量?

来自分类Dev

如何在模板挂钩中使用闭包参数?

来自分类Dev

如何在Rails控制器中使用闭包?

来自分类Dev

如何在PHP的闭包函数中使用变量?

来自分类Dev

如何从回调闭包中使用按钮本身?

来自分类Dev

如何在for循环中使用invalidate()

来自分类Dev

如何在for循环中使用awk?

来自分类Dev

如何关闭for循环中使用的游标

来自分类Dev

如何在循环中使用 fgets?

来自分类Dev

如何在循环中使用 Collection

来自分类Dev

如何在 For 循环中使用 UIAlertController

来自分类Dev

闭包函数从循环中追加所有索引

来自分类Dev

Javascript闭包-在for循环中传递infowindow id

来自分类Dev

for和foreach循环中的闭包行为不同

来自分类Dev

for循环中的函数的行为类似于闭包