watchOS 3 getSupportedTimeTravelDirections

watchOS 3 getSupportedTimeTravelDirections

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

Type 'ComplicationController' does not conform to protocol 'CLKComplicationDataSource' Candidate has non-matching type '(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 中关于此功能的变化吗?

变了!

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

注意@escaping 注释。

Swift 3.0 要求我们将闭包显式标记为 'escaping' 如果它们能够逃脱函数体的范围 - 例如,如果它们可以被复制到 属性.

来自 Xcode 8 beta 6 发行说明:

Closure parameters are non-escaping by default, rather than explicitly being annotated with @noescape. Use @escaping to indicate that a closure parameter may escape.

如果您在 Xcode 8 beta 6 中创建了一个新的 ComplicationController.swift 项目,生成的源代码现在如下所示:

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

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