gpt4 book ai didi

ios - 如何在 swift 的 for 循环中使用闭包?

转载 作者:行者123 更新时间:2023-11-28 13:16:15 25 4
gpt4 key购买 nike

我在 swift 中有一组按钮。每个按钮都有一个关闭。我试图在 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;
}
}

最佳答案

这是一个错误:

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 未在闭包主体中修改,因此必须在创建闭包时“复制”(参见“Capturing Values”)。相反,显然,编译器认为 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

关于ios - 如何在 swift 的 for 循环中使用闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28891327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com