【发布时间】: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?的函数。