2015-10-23 113 views
1

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

回答

3

我感谢@joern于采用在委托协议的建议,我在这里总结一下:

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

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

您可以使用类型转换描述的isas运营商检查 的协议一致性,并转换为特定的协议。检查 并转换成一协议遵循完全相同的语法 检查和强制转换为类型:

is运营商如果一个实例遵循的协议,如果不返回false返回true。

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") 
    } 
} 
+0

当然,但这可能只是在运行时使用。但是,包含和协议一致性可能只在编译时被屏蔽,但当然'is'和'as'不可用,或者任何常用工具来检查版本。 –

+0

您正在编译最新的iOS SDK代码,因此您的应用程序已知道该接口。但是检查是在运行时执行的。或者你认为在Objective-C Xcode的情况下为每个iOS SDK编译代码?它甚至不会运送它们! –

+0

恐怕我不理解你。 –

0

在斯威夫特2,你现在可以使用可用性检查从他们无法使用旧系统版本的屏蔽功能。

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

下面是关于如何从比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 
    } 
} 
+0

当然,我也这么做了,但是,这个问题再次出现在包含指令和协议采用中,其中#available标记可能不会被使用。当然,我不确定这是否会成为iOS 7的问题,因为我不再有iOS 7设备用于测试。 –

+0

你可以为你的问题添加一个代码示例,用于从您的代码包含指令和协议采用?我不太清楚你的意思 – joern

+0

在我的答案中,我通过使用扩展来屏蔽从旧系统版本采用的协议。 – joern