2015-10-23 161 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