Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中进行弱链接?_Ios_Objective C_Linker_Swift_Dynamic Linking - Fatal编程技术网

Ios 如何在Swift中进行弱链接?

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

在Objective-C中,如果我想使用一个只出现在新版iOS中的特定类,我会这样做:

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
    添加为链接框架(在“链接二进制库”部分),并将其状态更改为
    可选
    。这一步就完成了,我成功地运行了特定于版本的代码,没有任何问题

  • 更新:由于Xcode 6 beta 6(通过@user102008),您不需要再让它成为可选的

    更新2:实际上无法执行隐式if语句检查nil(因为Xcode 6 Beta 5)。您需要这样断言:

        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!
            }