我正在尝试使用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中有关此功能的变化吗?
答案 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])
}
此更改适用于具有处理程序参数的每个数据源方法。