#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?
- 更新:看起来像是我误用了BPCorp提到的API *
对上面的代码使用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 }
遗憾的是,Xcode 7 GM没有#if os(watchOS)
..
编辑:不确定添加时间,但现在您可以在Xcode 7.2上执行#if os(watchOS)
3条答案
按热度按时间liwlm1x91#
如果您只想在iOS上执行该代码,请使用
#if os(iOS)
而不是if #available(iOS ...)
。这样,您就不会对操作系统的版本进行动态检查,而是为一个操作系统或另一个操作系统编译不同的代码。
ivqmmu1c2#
在Apple开发指南中,星星
*
(必需)表示它将为未指定但在您的目标指定的最小部署目标中列出的操作系统执行if
主体。因此,如果您的目标客户指定iOS和watchOS,您的声明
if #available(iOS 9.0, *)
意味着if
主体适用于iOS 9及更高版本和任何watchOS版本。此外,如果您要使用本Apple指南中“构建配置”一章中所述的内容,请务必小心。它用于根据操作系统有条件地编译代码。这在运行时不是动态的。
tjvv9vkg3#
在通用版本的Xcode7中,我认为他们解决了这个问题。对我来说:
在GM版本中工作正常。