Обнаружение доступных 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
Ответы
Ответ 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.