Ios 如何在Swift中进行弱链接?
在Objective-C中,如果我想使用一个只出现在新版iOS中的特定类,我会这样做:Ios 如何在Swift中进行弱链接?,ios,objective-c,linker,swift,dynamic-linking,Ios,Objective C,Linker,Swift,Dynamic Linking,在Objective-C中,如果我想使用一个只出现在新版iOS中的特定类,我会这样做: if( [UIBlurEffect class] ) { // do something with UIBlurEffect } else { // gracefully fallback to old behavior } if NSClassFromString("UIVisualEffectView") != nil { //use the blur safely
if( [UIBlurEffect class] ) {
// do something with UIBlurEffect
}
else {
// gracefully fallback to old behavior
}
if NSClassFromString("UIVisualEffectView") != nil {
//use the blur safely
} else {
//abandon blur! try something safer
}
然而,等效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
添加为链接框架(在“链接二进制库”部分),并将其状态更改为可选。这一步就完成了,我成功地运行了特定于版本的代码,没有任何问题
if NSClassFromString("UIBlurEffect") != nil {
let blur = UIBlurEffect(...)
//...
}
else {
//...
}
(via@daniel galasko)只需加上我的两分钱,因为我最终使用了它,在将应用程序分发给我们的测试人员时,我立即感到沮丧。Swift编译器(Xcode)中有一个bug,可能与我想您应该使用可选的,类似于if-let-featureAvailable=NSNewFeature?{}else{}。但是我对SWIFSORRY-NSNewFeature非常陌生。self@user102008不是重复-我想有条件地使用单个类它不是[NSNewFeature class]而不是[NSNewFeatureClass]?或者只需尝试其他语法:class cls=NSClassFromString(@“NSRegularExpression”);if(cls){//创建类的实例并使用它。}否则{//当//类不可用时要遵循的备用代码路径。}但是,
import
语句的全部目的是避免手动添加框架的需要。我认为这可能只是一个实现错误。或者feature.update:您不需要再让它成为可选的,在Xcode 6 beta 6中,您实际上无法执行隐式if语句检查nil。您需要断言NSClass…!=nil{使用该类}其他{使用其他东西}有趣-这在6.3测试版中仍然发生吗?@Bill稍后将确认是否是这样,我希望不是,因为他们提到他们修复了发布优化的几个问题
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!
}