检查Swift中的协议可用性

时间:2015-10-23 17:27:36

标签: ios swift preprocessor protocols watchconnectivity

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

3 个答案:

答案 0 :(得分:4)

我感谢@joern建议在代表中采用该协议,我在此总结:

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

答案 1 :(得分:0)

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

  

您可以使用“类型转换”中描述的isas运算符进行检查   用于协议一致性,以及转换为特定协议。检查   for和cast to a protocol遵循完全相同的语法   检查并转换为类型:

     

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

     

转发运算符的as?版本   返回协议类型的可选值,该值为   如果实例不符合该协议,则为零。

     

as!版本   向下转换运算符强制向下转换为协议类型和   如果向下转换不成功,则会触发运行时错误。

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

答案 2 :(得分:0)

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

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

以下是如何从低于iOS9的版本屏蔽WCSessionWCSessionDelegate的示例:

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
    }
}