Swift 无法将Nil分配给类型()->;()?
这是一个类的函数,它让你有一个双击和一个点击的手势。它在Swift 2.3中运行良好,但在转换为Swift 3后,它会抛出一些错误。我一辈子都搞不懂。我评论了它们发生的地方Swift 无法将Nil分配给类型()->;()?,swift,swift3,Swift,Swift3,这是一个类的函数,它让你有一个双击和一个点击的手势。它在Swift 2.3中运行良好,但在转换为Swift 3后,它会抛出一些错误。我一辈子都搞不懂。我评论了它们发生的地方 // UIShortTapGestureRecognizer.swift // // import Foundation import UIKit func delayHelper(_ time:TimeInterval, task:@escaping ()->()) -> DelayTask?
// 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)
}
}
尝试:
var闭包:(()->())?=任务
使用@autoclosure允许我将nil分配给可选闭包
@autoclosure如何帮助我逃脱的全部细节(为什么“我的”闭包是“不好的”,而Swift生成的闭包是我的?)。
但是,它帮助我摆脱了。。。
…并通过以下两种方式之一调用我的函数:
someFunction(x, { ... })
或
以下是我如何克服这一问题的方法。在这里,clang不知道它的类型。我给出了一个typealias和可选声明
typealias appDelegateBlock = ()->()
在您的类中,只需将其声明为可选
var block: appDelegateBlock?
block = task
这意味着返回参数是可选的。尝试(()->())?我有点怀疑这是否会在Swift 2.3中编译,它还应该考虑将
()->()?
作为返回Void?
的函数。
typealias appDelegateBlock = ()->()
var block: appDelegateBlock?
block = task