【问题标题】:Nil cannot be assigned to type ()->()?不能将 Nil 分配给类型 ()->()?
【发布时间】:2017-04-22 22:17:04
【问题描述】:

所以这是一个类的函数,它可以让你有双击和单击手势。它在 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)
    }
}

【问题讨论】:

  • 表示返回参数是可选的。试试 (() -> ())?
  • 我有点怀疑这是否会在 Swift 2.3 中编译,它也应该认为 ()->()? 是一个返回 Void? 的函数。

标签: swift swift3


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    From another topic:

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

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

    @autoclosure 如何帮助我逃脱的全部细节(为什么“我的”闭包“不好”但 Swift_generated_one_that_simply_wraps_mine 是?)。 但是,它帮助我摆脱了... ...并以两种方式之一调用我的函数:

    someFunction(x, { ... }) 
    

    someFunction(x)
    

    【讨论】:

      【解决方案3】:

      这是我克服这个问题的方法。这里 clang 不知道它的类型。我给出了类型别名和可选声明,

      typealias appDelegateBlock = ()->()
      

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

      var block: appDelegateBlock?
      block = task
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-19
        • 2021-07-02
        • 1970-01-01
        • 2014-11-25
        • 2022-01-27
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多