2015-10-12 59 views
3

保持兩種類型之一在一個子類UIViewController需要聲明一個稱爲webView變量可以是UIWebView類型或WKWebView(取決於IOS版本)的。變量(枚舉?)在夫特2

是否有更好的方法來做到這一點(可能使用枚舉?)不是的其中一個選項:

  1. 聲明UIView類型的變量,然後有條件鑄造兩種每次我需要時間訪問它
  2. 不聲明共同父級UIViewController超類中的變量,但在兩個特定的UIViewController子類中聲明特定類型的變量兩次?感覺它違反了「不要重複自己」/ DRY原則。
+2

我目前無法測試它,但怎麼樣'#如果OS(watchOS)typealias MyWebView = WKWebView的#else typealias MyWebView =#UIWebView的endif'( 「構建配置語句」)? –

+0

我喜歡這個方法,但不幸的是我需要一個* runtime *解決方案,'#if'和'typealias'似乎是編譯時功能,因此在運行時不可用。除非我誤解了某些東西? –

+0

是的,這是在編譯時評估的。其實我昨天在電話上看到你的問題時,我誤解了這個問題。我以爲你想分享iOS和WatchOS應用程序之間的代碼,這在我的身邊非常愚蠢。 –

回答

3

你可以定義包含要在視圖上調用常用的方法協議

protocol MyWebView { 
    // ... 
} 

然後使雙方UIWebViewWKWebView符合該協議 (通過擴展):

extension UIWebView : MyWebView { 

} 

@available(iOS 8.0, *) 
extension WKWebView : MyWebView { 

} 

現在您可以聲明實例變量爲

var webView : MyWebView! 

,它取決於iOS版本初始化:

if #available(iOS 8, *){ 
    webView = WKWebView() 
} else { 
    webView = UIWebView() 
} 
+0

這種方法似乎有問題。如果部署目標是iOS 7,則連接器將失敗。我可能必須刪除答案... –

+1

您只需要弱連接WebKit框架即可解決此問題:) –

+0

@AndrewEbling:您說得對,那是可行的。 –

0

我的應用程序中有一個類似的問題,使用不同的已棄用框架。該解決方案爲我工作:

創建一個屬性,如下圖所示:

var webView: AnyObject! 

viewDidLoad,使用此代碼初始化Web視圖:

if #available(iOS 9, *){ 
    webView = WKWebView() 
} else { 
    webView = UIWebView() 
} 

其他地方在你的代碼,當你需要使用此Web視圖執行某些操作,您需要執行類似操作:

if #available(iOS 9, *){ 
    let newWebView = webView as! WKWebView 
    // use newWebView 
} else { 
    let oldWebView = webView as! UIWebView 
    // use oldWebView 
} 

注意:Martin R建議使用類型別名也可以,但這個解決方案我已經測試過了。

+0

謝謝 - 這實際上是我在原始帖子中提出的選項1。 當然仍然對其他建議開放。 –