2

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

4

3 回答 3

5

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

@available(iOS 9, *)
extension inArrivoHDAppDelegate: WCSessionDelegate {}
于 2015-10-24T11:14:02.597 回答
0

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

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

下面是一个关于如何屏蔽低于 iOS9 版本WCSession的示例:WCSessionDelegate

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
    }
}
于 2015-10-24T08:28:38.830 回答
0

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

您可以使用类型转换中描述的isandas运算符来检查协议一致性,并转换为特定协议。检查并转换为协议遵循与检查并转换为类型完全相同的语法:

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

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

向下转换运算符的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")
    }
}
于 2015-10-23T17:42:56.187 回答