如何在Swift中进行弱链接?

Bil*_*ill 16 linker objective-c dynamic-linking ios swift

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

if( [UIBlurEffect class] ) {
  // do something with UIBlurEffect
}
else {
  // gracefully fallback to old behavior
}
Run Code Online (Sandbox Code Playgroud)

但是,等效的Swift:

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

// also occurs with NSClassFromString("UIBlurEffect")
Run Code Online (Sandbox Code Playgroud)

没有相同的功能.

如果在NSNewFeature可用的环境中运行,一切都很好.但是如果未定义类,则在启动应用程序时会出现链接错误:

dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect
Run Code Online (Sandbox Code Playgroud)

那么如何在Swift中进行弱链接?

编辑添加UIBlurEffect为特定示例.

Iev*_*gen 5

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

  1. 我曾经NSClassFromString()检查过设备上是否有类,即

    if NSClassFromString("UIBlurEffect") {
        let blur = UIBlurEffect(...)
        //...
    }
    else {
        //...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 需要使UIKit.framework(或另一个相应的框架)可选.如果您在XCode6-BetaX中创建基于Swift的应用程序,则所有框架都不会显式添加到链接构建阶段,因此您需要转到目标设置,添加UIKit.framework为链接框架(在"Link Binary With Libraries"部分中) )并将其状态更改为Optional.这一步可以解决问题,我已经设法运行特定于版本的代码而没有任何问题.

更新:因为Xcode 6 beta 6(来自@ user102008),您不再需要将其设为可选项

更新2:您实际上无法对nil执行隐式if语句检查(自Xcode 6 Beta 5起).你需要断言它:

    if NSClassFromString("UIBlurEffect") != nil {
        let blur = UIBlurEffect(...)
        //...
    }
    else {
        //...
    }
Run Code Online (Sandbox Code Playgroud)

(来自@ daniel-galasko)