在Swift中检查协议的可用性

我正在采用WatchConnectivity,但我仍然支持iOS7和iOS8,因为这个库不可用。 而且我采用的协议WCSessionDelegate也不支持这个旧的系统。 在ObjectiveC中,我会使用预处理指令来屏蔽这个声明,并从不支持它们的版本中采用协议。 我如何处理在Swift中,以便应用程序不会在旧系统上崩溃?

我感谢@joern在我这里总结的代表中提出采纳议定书的build议:

@available(iOS 9, *) extension inArrivoHDAppDelegate: WCSessionDelegate {} 

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID283

您可以使用types转换中描述的isas操作符来检查协议一致性,并转换为特定的协议。 检查并转换为协议遵循与检查和转换为types完全相同的语法:

如果实例符合协议,则is运算符返回true,否则返回false。

as? downcast运算符的版本返回协议types的可选值,如果实例不符合该协议,则此值为nil。

as! downcast运算符的版本强制downcast转换为协议types,如果downcast不成功,则触发运行时错误。

 for object in objects { if let objectWithArea = object as? HasArea { print("Area is \(objectWithArea.area)") } else { print("Something that doesn't have an area") } } 

在Swift 2中,您现在可以使用可用性检查来屏蔽旧系统版本中不可用的function。

如果您只想屏蔽部分方法,您可以在ifguardwhile语句中使用可用性检查,或者可以屏蔽整个函数,扩展甚至类。

这里是一个关于如何屏蔽WCSessionWCSessionDelegate版本低于iOS9的例子:

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() if #available(iOS 9, *) { if WCSession.isSupported() { let session = WCSession.defaultSession() session.delegate = self session.activateSession() } } } } @available(iOS 9, *) extension ViewController: WCSessionDelegate { func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) { // do stuff } }