【问题标题】:How to return void @escaping closure in swift 3.0?如何在 swift 3.0 中返回 void @escaping 闭包?
【发布时间】:2017-01-21 07:39:42
【问题描述】:

我是 swift 3.0 的新手,我在一个小代码 sn-p 中遇到问题,当我按照附加的屏幕截图将 @escaping 闭包分配给 nil 时,它会抛出错误:

这是我的代码...

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;
}

谁能帮我解决这个问题。
提前致谢。

【问题讨论】:

  • 邮政编码不是截图。

标签: ios swift


【解决方案1】:

似乎您的问题更多的是可选闭包类型而不是@escaping

尝试更改此行:

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

到:

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

()->()? 代表一个非可选闭包,它返回()?(又名Optional<Void>),这可能不是您想要的。

【讨论】:

    【解决方案2】:

    在 swift 3 中还有另一个来自 david-lawsonsolution

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2022-10-21
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多