watchOS 3 getSupportedTimeTravelDirections

时间:2016-08-22 13:25:51

标签: swift swift3 xcode8 apple-watch-complication clockkit

我正在尝试使用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中有关此功能的变化吗?

2 个答案:

答案 0 :(得分:2)

它改变了!

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

注意@escaping注释。

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

答案 1 :(得分: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])
}

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