Подтвердить что ты не робот

Обнаружение доступных API iOS против watchOS в Swift

#available, похоже, не работает при дифференциации между watchOS и iOS.

Ниже приведен пример кода, разделяемого между iOS и watchOS:

lazy var session: WCSession = {
    let session = WCSession.defaultSession()
    session.delegate = self
    return session
}()

...

if #available(iOS 9.0, *) {
    guard session.paired else { throw WatchBridgeError.NotPaired } // paired is not available
    guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp } // watchAppInstalled is not available
}

guard session.reachable else { throw WatchBridgeError.NoConnection }

Кажется, что он по умолчанию имеет значение WatchOS, а #available не рассматривается компилятором.

Я злоупотребляю этим API или есть ли другой способ дифференцировать код между iOS и WatchOS?

Обновление: похоже, я злоупотреблял API, как упоминалось в BPCorp

Использование решения Tali для вышеописанного кода работает:

    #if os(iOS)
        guard session.paired else { throw WatchBridgeError.NotPaired }
        guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp }
    #endif

    guard session.reachable else { throw WatchBridgeError.NoConnection } 

К сожалению, нет #if os(watchOS).. от Xcode 7 GM

Изменить: не уверен, когда он был добавлен, но теперь вы можете сделать #if os(watchOS) в Xcode 7.2

4b9b3361

Ответ 1

Если вы хотите выполнить этот код только на iOS, используйте #if os(iOS) вместо if #available(iOS ...).

Таким образом, вы не используете динамическую проверку для версии вашей операционной системы, но компилируете другой код для одной ОС или другой.

Ответ 2

В руководстве Apple dev говорится, что звезда * (что требуется) означает, что она выполнит команду if для ОС, не указанных, но указанных в минимальной цели развертывания, указанной вашей целью.

Итак, если ваша цель указывает iOS и watchOS, ваш оператор if #available(iOS 9.0, *) означает, что тело if доступно для iOS 9 и более поздних и любой версии watchOS.

Кроме того, будьте осторожны, если вы хотите использовать то, что описано в главе "Конфигурации сборки" в этом руководстве Apple. Он используется для условной компиляции кода на основе операционной системы. Это не динамично во время выполнения.

Ответ 3

С GM-версией Xcode7 я думаю, что они исправили эту проблему. Для меня:

if #available(watchOS 2,*) {
    // Only if using WatchOS 2 or higher
}

работает отлично в версии GM.