【问题标题】:Swift 2 declare function with a generic closure paramsSwift 2 使用通用闭包参数声明函数
【发布时间】:2016-10-23 12:25:19
【问题描述】:

我定义了一个带有通用闭包参数的函数,如下所示:

final class Utils {
    static func asyncTask<T>(task: () -> T, main: (res: T) -> Void) {
        dispatch_async(dispatch_get_global_queue(0, 0)) {
            let result = task()
            dispatch_async(dispatch_get_main_queue()) {
                main(res: result)
            }
        }
    }
}

那么,我称之为:

Utils.asyncTask({ () -> Int? in
    let rows = self.cursor.db.query(true)
    if !rows.isEmpty {
        return (rows[0] as? BookMark)?.rowId
    }

    return nil
}) { rowId in

}

但是我得到了一个编译时错误:

无法转换 '() -> Int?' 类型的值到预期的参数类型 '() -> _'

为什么?

Swift 确实支持泛型闭包作为函数参数,不是吗?

有人可以帮助我吗?

谢谢。

【问题讨论】:

  • 对我来说编译得很好——也许尝试清理你的构建文件夹?此外,如果您在操场上,请在一个完整的项目中尝试一下。

标签: swift generics


【解决方案1】:

也许我错了,但恕我直言,你的通用闭包需要参数类型 () -> Int,但后来你实际上正在做:() -> Int?,实际上它需要可选类型。

也许其他答案会给你一些提示:How to determine if a generic is an optional in Swift?

为了示例,我已尝试简化您的代码:

final class Utils {
    static func asyncTask<T>(task: () -> T, main: (res: T) -> Void) {
        let result = task()
        print("result: \(result)")

        main(res: result)
    }
}

Utils.asyncTask({ () -> Int in
   return 5
}) { rowId in
    print("rowId: \(rowId)")
}

或者像这样:

final class Utils {
    static func asyncTask<T>(task: () -> T?, main: (res: T) -> Void) {
        let result = task()
        print("result: \(result)")

        main(res: result!)
    }
}

Utils.asyncTask({ () -> Int? in
   return 5
}) { rowId in
    print("rowId: \(rowId)")
}

它适用于:

Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31)
Target: x86_64-apple-macosx10.9

【讨论】:

  • 也许尝试重写为:static func asyncTask(task: () -> T?, main: (res: T) -> Void) {
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 2019-01-07
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多