当前位置: 首页 > 知识库问答 >
问题:

Nil不能分配给类型 ()->()?

空正豪
2023-03-14

这是一个类中的函数,允许你双击和单击手势。它在Swift 2.3中运行良好,但在转换到Swift 3后,它抛出了一些错误。我怎么也想不明白。我评论了它们发生的地方。

//  UIShortTapGestureRecognizer.swift
//
//

import Foundation
import UIKit


    func delayHelper(_ time:TimeInterval, task:@escaping ()->()) ->  DelayTask? {

        func dispatch_later(_ block:@escaping ()->()) {
            DispatchQueue.main.asyncAfter(
                deadline: DispatchTime.now() + Double(Int64(time * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC),
                execute: block)
        }

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

        var result: DelayTask?

        let delayedClosure: DelayTask = {
            cancel in

//Initializer for conditional binding must have Optional type, not '() -> ()?'
            if let internalClosure = closure {
                if (cancel == false) {
                    DispatchQueue.main.async(execute: internalClosure)
                }
            }

// here it says Nil cannot be assigned to type '() -> ()?'
            closure = nil

            result = nil
        }

        result = delayedClosure

        dispatch_later {
            if let delayedClosure = result {
                delayedClosure(false)
            }
        }

        return result;
    }

    func cancel(_ task:DelayTask?) {
        task?(true)
    }
}

共有3个答案

萧星火
2023-03-14

以下是我如何克服这个问题的方法。在这里,clang不知道它的类型。我给出了一个typealias和可选声明,

typealias appDelegateBlock = ()->()

在您的类中,只需将其声明为可选,

var block: appDelegateBlock?
block = task
黄沈浪
2023-03-14

从另一个话题:

func someFunction(someParameter: someType, completionClosure: @escaping @autoclosure () -> ()? = nil)

使用@自动闭包允许我将nil分配给可选闭包。

someFunction(x, { ... }) 

someFunction(x)
濮阳弘扬
2023-03-14

尝试:var闭包:()-

 类似资料: