我正在采用 WatchConnectivity,但我仍然支持该库不可用的 iOS7 和 iOS 8。此外,我采用的协议 WCSessionDelegate 也不支持,但这个旧系统。在 ObjectiveC 中,我会使用预处理指令来屏蔽此声明和协议采用,使其免受不支持它们的版本的影响。如何在 Swift 中处理该问题,以使应用程序不会在旧系统上崩溃?
问问题
1207 次
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
您可以使用类型转换中描述的
is
andas
运算符来检查协议一致性,并转换为特定协议。检查并转换为协议遵循与检查并转换为类型完全相同的语法:如果实例符合协议,
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 回答