简体   繁体   English

如何在Swift 3.0中返回void @Escapeing Closure?

[英]How to return void @escaping closure in swift 3.0?

I am new to swift 3.0 , i am facing issue in one little code snippet which is throwing error when i assign @escaping closure to nil as per attached screenshot: 我是swift 3.0的新手,我在一个小代码段中遇到问题,当我按照所附的屏幕截图将@escaping闭包分配给nil时,抛出错误:

屏幕截图 and here is my code... 这是我的代码...

func delay(_ time:TimeInterval, closure: @escaping ()-> ()) -> dispatch_cancelable_closure? 
{

    func dispatch_later(_ clsr:@escaping ()->Void) {
        DispatchQueue.main.asyncAfter(
            deadline: DispatchTime.now() + Double(Int64(time * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: clsr)
    }
    var closure : ()->()? = closure
    var cancelableClosure:dispatch_cancelable_closure?
    let delayedClosure:dispatch_cancelable_closure = { cancel in

        if closure != nil {
            if (cancel == false) {
                DispatchQueue.main.async(execute: closure as! @convention(block) () -> Void);
            }
        }

        closure = nil
        cancelableClosure = nil

    }
    cancelableClosure = delayedClosure
    dispatch_later {
        if let delayedClosure = cancelableClosure {
            delayedClosure(false)
        }
    }
    return cancelableClosure;
}

Can anyone please help me on this issue. 谁能帮我解决这个问题。
Thanks in advance. 提前致谢。

Seems your issue is more of an Optional closure type than @escaping . 似乎您的问题比@escaping是可选的闭包类型。

Try changing this line: 尝试更改此行:

var closure : ()->()? = closure

to: 至:

var closure : (()->())? = closure

()->()? represents a non-Optional closure which returns ()? 表示返回()?的非可选闭包()? (aka Optional<Void> ), which may not be what you want. (又名Optional<Void> ),这可能不是您想要的。

in swift 3 there is an other solution from david-lawson 在Swift 3中, David Lawson提供了另一种解决方案

let task = DispatchWorkItem { print("do something") }

// execute task in 2 seconds
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2, execute: task)

// optional: cancel task
task.cancel()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM