【问题标题】:watchOS 3 getSupportedTimeTravelDirectionswatchOS 3 getSupportedTimeTravelDirections
【发布时间】:2016-08-23 05:11:33
【问题描述】:

我正在尝试将我的 watchOS 2 应用程序更新为 watchOS 3 的并发症。不幸的是,我不明白我在 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 中关于这个函数的变化吗?

【问题讨论】:

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


    【解决方案1】:

    来自 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])
    }
    

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

    【讨论】:

    • 此更改适用于具有处理程序参数的每个数据源方法...不能再强调这一点。如果您遇到此类错误的问题,请检查文档或生成的 Swift 接口以获取您的 API 来自的标头。 (此外,根据霍金的说法,IIRC 唯一支持从该方法返回的应该是 .forward。)
    【解决方案2】:

    变了!

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

    注意@escaping 注释。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2016-11-25
      • 2023-03-29
      • 2016-12-20
      • 1970-01-01
      • 2016-11-03
      • 2017-02-01
      相关资源
      最近更新 更多