检测可用 API iOS 与 Swift 中的 watchOS
Detecting available API iOS vs. watchOS in 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?
更新:好像我误用了 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 }
不幸的是没有#if os(watchOS)
..截至Xcode 7 GM
编辑:不确定它是何时添加的,但您现在可以在 Xcode 7.2
上执行 #if os(watchOS)
在Apple dev guide中说的是星号,*
(必填)表示对于未指定但在您的目标指定的最低部署目标。
因此,如果您的目标指定 iOS 和 watchOS,您的声明 if #available(iOS 9.0, *)
意味着 if
正文可用于 iOS 9 及更高版本 和 任何 watchOS 版本。
此外,如果您想在 Apple guide 中使用第 "Build Configurations" 章中描述的内容,请务必小心。它用于根据操作系统有条件地编译您的代码。这在运行时不是动态的。
如果您只想在 iOS 上执行该代码,请使用 #if os(iOS)
而不是 if #available(iOS ...)
。
这样一来,您就不会对操作系统的版本进行动态检查,而是为一个 OS 或另一个编译不同的代码。
对于 Xcode7 的 GM 版本,我认为他们解决了这个问题。对我来说:
if #available(watchOS 2,*) {
// Only if using WatchOS 2 or higher
}
在 GM 版本中运行良好。
#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 }
不幸的是没有#if os(watchOS)
..截至Xcode 7 GM
编辑:不确定它是何时添加的,但您现在可以在 Xcode 7.2
上执行#if os(watchOS)
在Apple dev guide中说的是星号,*
(必填)表示对于未指定但在您的目标指定的最低部署目标。
因此,如果您的目标指定 iOS 和 watchOS,您的声明 if #available(iOS 9.0, *)
意味着 if
正文可用于 iOS 9 及更高版本 和 任何 watchOS 版本。
此外,如果您想在 Apple guide 中使用第 "Build Configurations" 章中描述的内容,请务必小心。它用于根据操作系统有条件地编译您的代码。这在运行时不是动态的。
如果您只想在 iOS 上执行该代码,请使用 #if os(iOS)
而不是 if #available(iOS ...)
。
这样一来,您就不会对操作系统的版本进行动态检查,而是为一个 OS 或另一个编译不同的代码。
对于 Xcode7 的 GM 版本,我认为他们解决了这个问题。对我来说:
if #available(watchOS 2,*) {
// Only if using WatchOS 2 or higher
}
在 GM 版本中运行良好。