我正在采用WatchConnectivity,但我仍然支持这个库不可用的iOS7和iOS 8。此外,我采用协议WCSessionDelegate也不支持,但这个旧系统。 在ObjectiveC中,我会使用预处理指令来屏蔽此声明以及从不支持它们的版本中采用协议。如何在Swift中处理它,以便应用程序不会在旧系统上崩溃?
答案 0 :(得分:4)
我感谢@joern建议在代表中采用该协议,我在此总结:
@available(iOS 9, *)
extension inArrivoHDAppDelegate: WCSessionDelegate {}
答案 1 :(得分:0)
您可以使用“类型转换”中描述的
is
和as
运算符进行检查 用于协议一致性,以及转换为特定协议。检查 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中,您现在可以使用可用性检查来屏蔽旧系统版本中不可用的功能。
如果您只想屏蔽方法的一部分,或者您可以屏蔽整个功能,扩展甚至屏蔽,则可以在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
}
}