簡體   English   中英

如何在Swift中進行弱鏈接?

[英]How do I do weak linking in Swift?

在Objective-C中,如果我想使用僅出現在新版iOS中的特定類,我會這樣做:

if( [UIBlurEffect class] ) {
  // do something with UIBlurEffect
}
else {
  // gracefully fallback to old behavior
}

但是,等效的Swift:

if UIBlurEffect.self != nil {
  let blur: UIBlurEffect = UIBlurEffect(...)
  // ...
else {
  // ...
}

// also occurs with NSClassFromString("UIBlurEffect")

沒有相同的功能。

如果在NSNewFeature可用的環境中運行,一切都很好。 但是如果未定義類,則在啟動應用程序時會出現鏈接錯誤:

dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect

那么如何在Swift中進行弱鏈接?

編輯添加了UIBlurEffect作為具體示例。

好像我已經知道你能做什么了

  1. 我使用NSClassFromString()來檢查類是否在設備上可用,即

     if NSClassFromString("UIBlurEffect") { let blur = UIBlurEffect(...) //... } else { //... } 
  2. 需要使UIKit.framework (或其他相應的框架)可選。 如果您在XCode6-BetaX中創建基於Swift的應用程序,則所有框架都不會顯式添加到鏈接構建階段,因此您需要轉到目標設置,將UIKit.framework添加為鏈接框架(在“鏈接二進制文件”中)庫的“部分”並將其狀態更改為“ Optional 這一步可以解決問題,我已經設法運行特定於版本的代碼而沒有任何問題。

更新 :因為Xcode 6 beta 6(來自@ user102008),您不再需要將其設為可選項

更新2 :您實際上無法對nil執行隱式if語句檢查(自Xcode 6 Beta 5起)。 你需要斷言它:

    if NSClassFromString("UIBlurEffect") != nil {
        let blur = UIBlurEffect(...)
        //...
    }
    else {
        //...
    }

(來自@ daniel-galasko)

只是為了增加我的兩分錢,因為我最終使用這個讓我立刻感到沮喪,因為我將測試應用程序分發給我們的測試人員。 Swift編譯器中存在一個錯誤(Xcode <= 6.1.1),當在Release模式下構建時,編譯器在調用NSClassFromString時實際上不會返回nil。

要檢查我,只需將您的配置更改為Release,看看她是如何崩潰的。

我最終不得不在其他地方明確檢查iOS版本或簡單的respondsToSelector調用。

所以我的代碼看起來像這樣:

    if NSClassFromString("UIVisualEffectView") != nil {
        //use the blur safely
    } else {
        //abandon blur! try something safer
    }

我最終不得不使用它

switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
        case .OrderedSame, .OrderedDescending:
            //go wild with blur
        case .OrderedAscending:
            //blur shall not pass here!
        }

這個問題涉及同樣的問題 - UIAlertView在iOS 7上崩潰應用程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM