3

我正在尝试用 watchOS 3 的并发症更新我的 watchOS 2 应用程序。不幸的是,我不明白我在 ComplicationController 方面做错了什么。我总是收到以下错误(使用 Xcode 8 b6):

类型“ComplicationController”不符合协议“CLKComplicationDataSource”候选人具有不匹配类型“(CLKComplication,(CLKComplicationTimeTravelDirections)-> Void)->()”

代码:

class ComplicationController: NSObject, CLKComplicationDataSource {

    func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) {
        handler([.forward])
    }
...
}

我也试过:

handler(.forward)

这两种方法在 watchOS 3 上都给我一个错误,但在 watchOS 2 / Swift 2 上工作得很好。有人知道 Swift 3 关于这个功能有什么变化吗?

4

2 回答 2

2

变了!

func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) {
    handler([.forward, .backward])
}

注意@escaping 注释。

Swift 3.0 要求我们明确地将闭包标记为“转义”,如果它们能够逃脱函数体的范围 - 例如,如果它们可以被复制到属性中。

于 2016-08-22T16:59:13.823 回答
2

来自 Xcode 8 beta 6 发行说明:

默认情况下,闭包参数是非转义的,而不是使用@noescape 显式注释。使用@escaping 表示闭包参数可能会转义。

如果你在 Xcode 8 beta 6 中创建了一个新的 ComplicationController.swift 项目,生成的源代码现在看起来像:

func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) {
    handler([.forward, .backward])
}

此更改适用于具有处理程序参数的每个数据源方法。

于 2016-08-22T16:59:29.910 回答