Weak Linking – check if a class exists and use that class

TLDR

Current:

  • Swift: if #available(iOS 9, *)
  • Obj-C, iOS: if (@available(iOS 11.0, *))
  • Obj-C, OS X: if (NSClassFromString(@"UIAlertController"))

Legacy:

  • Swift (versions prior to 2.0): if objc_getClass("UIAlertController")
  • Obj-C, iOS (versions prior to 4.2): if (NSClassFromString(@"UIAlertController"))
  • Obj-C, iOS (versions prior to 11.0): if ([UIAlertController class])

Swift 2+

Although historically it’s been recommended to check for capabilities (or class existence) rather than specific OS versions, this doesn’t work well in Swift 2.0 because of the introduction of availability checking.

Use this way instead:

if #available(iOS 9, *) {
    // You can use UIStackView here with no errors
    let stackView = UIStackView(...)
} else {
    // Attempting to use UIStackView here will cause a compiler error
    let tableView = UITableView(...)
}

Note: If you instead attempt to use objc_getClass(), you will get the following error:

⛔️ ‘UIAlertController’ is only available on iOS 8.0 or newer.


Previous versions of Swift

if objc_getClass("UIAlertController") != nil {
    let alert = UIAlertController(...)
} else {
    let alert = UIAlertView(...)
}

Note that objc_getClass() is more reliable than NSClassFromString() or objc_lookUpClass().


Objective-C, iOS 4.2+

if ([SomeClass class]) {
    // class exists
    SomeClass *instance = [[SomeClass alloc] init];
} else {
    // class doesn't exist
}

See code007’s answer for more details.


OS X or previous versions of iOS

Class klass = NSClassFromString(@"SomeClass");
if (klass) {
    // class exists
    id instance = [[klass alloc] init];
} else {
    // class doesn't exist
}

Use NSClassFromString(). If it returns nil, the class doesn’t exist, otherwise it will return the class object which can be used.

This is the recommended way according to Apple in this document:

[…] Your code would test for the
existence of [a] class using
NSClassFromString() which will return
a valid class object if [the] class
exists or nil if it doesnʼt. If the
class does exist, your code can use it
[…]

Leave a Comment