首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转义闭包捕获“inout”参数

转义闭包捕获“inout”参数
EN

Stack Overflow用户
提问于 2022-01-28 06:56:14
回答 1查看 2.1K关注 0票数 3

我有一个如下所示的函数,但当我执行它时,它显示“转义闭包捕获'inout‘参数'cani'”,而我遗漏了什么吗?

代码语言:javascript
复制
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'”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-28 07:55:54

当您输入您的函数时,cani值将被复制,当您退出该函数时,可能修改的复制值将被写回。这就是inout所做的。

您的函数是异步的,因此它会立即退出,并且cani不会被修改。

当您的计时器闭包被调用时,首先您甚至不知道调用方是否还在运行,但是您可以确保传递的cani副本不再存在,因为函数已经退出了一段时间。

编译器检测到这种非意义,并告诉您要采取不同的做法。

您可以考虑在调用计时器的对象中添加一个cani属性,并在计时器闭包中更改其值,因为它是异步的,因此在计时器问题时调用闭包执行您想做的事情。

代码语言:javascript
复制
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问题中添加简单易懂的代码。如果可能的话,是可以建造的。;)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70889898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档