gpt4 book ai didi

swift - 转义闭包捕获 'inout' 参数

转载 作者:行者123 更新时间:2023-12-05 03:30:15 27 4
gpt4 key购买 nike

我有一个像下面这样的函数,但是当我执行它时,它显示“Escaping closure captures 'inout' parameter '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’”

最佳答案

当你输入你的函数时,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 问题中放入简单易懂的代码。如果可能的话,可构建。 ;)

关于swift - 转义闭包捕获 'inout' 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70889898/

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