Alternative to performSelector in Swift?

performselector, swift

Solution

Using closures

class A {
    var selectorClosure: (() -> Void)?

    func invoke() {
        self.selectorClosure?()
    }
}

var a = A()
a.selectorClosure = { println("Selector called") }
a.invoke()

Note that this is nothing new, even in Obj-C the new APIs prefer using blocks over `performSelector` (compare `UIAlertView` which uses `respondsToSelector:` and `performSelector:` to call delegate methods, with the new `UIAlertController`).

Using `performSelector:` is always unsafe and doesn't play well with ARC (hence the ARC warnings for `performSelector:`).

Problem

The `performSelector` family of methods are not available in Swift. So how can you call a method on an `@objc` object, where the method to be called is chosen at runtime, and not known at compile time? `NSInvocation` is apparently also not available in Swift. I know that in Swift, you can send any method (for which there is an `@objc` method declaration visible) to the type `AnyObject`, similar to `id` in Objective-C. However, that still requires you to hard-code the method name at compile-time. Is there a way to dynamically choose it at runtime?

Original source

Related problems