[英]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
作為具體示例。
好像我已經知道你能做什么了
我使用NSClassFromString()
來檢查類是否在設備上可用,即
if NSClassFromString("UIBlurEffect") { let blur = UIBlurEffect(...) //... } else { //... }
需要使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.