watchOS 3 getSupportedTimeTravelDirections

Я пытаюсь обновить свое приложение 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 в отношении этой функции?


person MikeB    schedule 22.08.2016    source источник


Ответы (2)


Из примечаний к выпуску Xcode 8 beta 6:

Параметры закрытия по умолчанию не экранируются, а не аннотируются явно с помощью @noescape. Используйте @escaping, чтобы указать, что параметр закрытия может экранироваться.

Если вы создали новый проект ComplicationController.swift в Xcode 8 beta 6, сгенерированный исходный код теперь будет выглядеть так:

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

Это изменение применяется ко всем методам источника данных, имеющим параметр-обработчик.

person Community    schedule 22.08.2016
comment
Это изменение применяется ко всем методам источника данных, имеющим параметр-обработчик... не могу не подчеркнуть этого. Если у вас возникли проблемы с подобными ошибками, проверьте документы или сгенерированный интерфейс Swift на предмет заголовка, из которого исходит ваш API. (Кроме того, IIRC, по словам Хокинга, единственным поддерживаемым возвратом этого метода должен быть .forward.) - person rickster; 22.08.2016

Он изменился!

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

Обратите внимание на аннотацию @escaping.

Swift 3.0 требует, чтобы мы явно помечали замыкания как «экранирующие», если они могут выйти за пределы тела функции — например, если их можно скопировать в свойство.

person ncke    schedule 22.08.2016