How do I do weak linking in Swift?

dynamic-linking, ios, linker, objective-c, swift

Solution

Seems like I've figured out what you can do

I used `NSClassFromString()` to check if class is available on device, i.e.

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

It's needed to make `UIKit.framework` (or another corresponding framework) optional. If you create Swift-based application in XCode6-BetaX, all the frameworks wouldn't be explicitly added to the link build phase so you need to go to your target settings, add `UIKit.framework` as a linked framework (in 'Link Binary With Libraries' section) and to change its status to `Optional`. This step does the trick and I've managed to run version specific code without a problem.

Update: You don't need to make it optional anymore, since Xcode 6 beta 6 (via @user102008)

Update 2: You can't actually perform implicit if statement checks for nil (since Xcode 6 Beta 5). You need to assert it like that:

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

(via @daniel-galasko)

Problem

In Objective-C, if I wanted to use a specific class that's only present in a new version of iOS, I would do something like this: ``` if( [UIBlurEffect class] ) { // do something with UIBlurEffect } else { // gracefully fallback to old behavior } ``` However, the equivalent Swift: ``` if UIBlurEffect.self != nil { let blur: UIBlurEffect = UIBlurEffect(...) // ... else { // ... } // also occurs with NSClassFromString("UIBlurEffect") ``` doesn't have the same functionality. If run on an environment where `NSNewFeature` is available, everything is fine. But if the class isn't defined, I get a link error when starting the application: ``` dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect ``` So how do I do weak linking in Swift? Edit Added `UIBlurEffect` as specific example.

Original source

Related problems