我有一个如下所示的函数,但当我执行它时,它显示“转义闭包捕获'inout‘参数'cani'”,而我遗漏了什么吗?
func duration(out:Int,h2:Int,rep:Int,cani:inout Bool){
var io = 0
var b = 0
cani = false
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { // "Escaping closure captures 'inout' parameter 'cani'" //
timer in
io += 1
b += 1
if b <= out{
text = "come in"
}else if b <= out + h2 && b > out{
text = "Hold on"
}
if io == (out + h2 ) * rep{
textcange = "End"
timer.invalidate()
cani = true
}
}
}它显示“转义闭包捕获'inout‘参数'cani'”
发布于 2022-01-28 07:55:54
当您输入您的函数时,cani值将被复制,当您退出该函数时,可能修改的复制值将被写回。这就是inout所做的。
您的函数是异步的,因此它会立即退出,并且cani不会被修改。
当您的计时器闭包被调用时,首先您甚至不知道调用方是否还在运行,但是您可以确保传递的cani副本不再存在,因为函数已经退出了一段时间。
编译器检测到这种非意义,并告诉您要采取不同的做法。
您可以考虑在调用计时器的对象中添加一个cani属性,并在计时器闭包中更改其值,因为它是异步的,因此在计时器问题时调用闭包执行您想做的事情。
func duration(out:Int,h2:Int,rep:Int,cani:inout Bool){
var io = 0
var b = 0
var test: String
Timer.scheduledTimer(withTimeInterval: 1.0,
repeats: true,
completion: (String)->Void) {
timer in
io += 1
b += 1
if b <= out {
text = "Come in"
} else if b <= out + h2 {
text = "Hold on"
}
if io == (out + h2 ) * rep {
text = "End"
timer.invalidate()
completion()
}
}
}最好在StackOverflow问题中添加简单易懂的代码。如果可能的话,是可以建造的。;)
https://stackoverflow.com/questions/70889898
复制相似问题