在Swift中检测可用的API iOS与watchOS
区分watchOS和iOS时, #available
似乎不起作用。
以下是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之间的代码?
更新:似乎我正在滥用BPCorp提到的API
上面的代码工作使用Tali的解决scheme:
#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开始
编辑:不知道什么时候它被添加,但你现在可以在Xcode 7.2上执行#if os(watchOS)
如果只想在iOS上执行该代码,请使用#if os(iOS)
而不要使用#if os(iOS)
if #available(iOS ...)
。
这样,您就不会使用dynamic检查操作系统的版本,而是针对一个操作系统或其他操作系统编译不同的代码。
在Apple开发指南中 ,据说明星*
(这是必需的)意味着它将为未指定的操作系统执行if
主体,但列在目标指定的最小部署目标中。
因此,如果您的目标指定了iOS 和 watchOS,那么您的语句if #available(iOS 9.0, *)
意味着if
body可用于iOS 9及更高版本以及任何watchOS版本。
另外,如果您想使用本Apple指南中的“构buildconfiguration”一章中所述的内容,请小心。 它被用来根据操作系统有条件地编译你的代码。 这在运行时不是dynamic的。
有了Xcode7的GM版本,我认为他们解决了这个问题。 为了我 :
if #available(watchOS 2,*) { // Only if using WatchOS 2 or higher }
在通用版本中工作正常。