What is the Swift equivalent of respondsToSelector?
objective-c, selector, swift
Solution
As mentioned, in Swift most of the time you can achieve what you need with the `?` optional unwrapper operator. This allows you to call a method on an object if and only if the object exists (not `nil`) and the method is implemented.
In the case where you still need `respondsToSelector:`, it is still there as part of the `NSObject` protocol.
If you are calling `respondsToSelector:` on an Obj-C type in Swift, then it works the same as you would expect. If you are using it on your own Swift class, you will need to ensure your class derives from `NSObject`.
Here's an example of a Swift class that you can check if it responds to a selector:
class Worker : NSObject
{
func work() { }
func eat(food: AnyObject) { }
func sleep(hours: Int, minutes: Int) { }
}
let worker = Worker()
let canWork = worker.respondsToSelector(Selector("work")) // true
let canEat = worker.respondsToSelector(Selector("eat:")) // true
let canSleep = worker.respondsToSelector(Selector("sleep:minutes:")) // true
let canQuit = worker.respondsToSelector(Selector("quit")) // false
It is important that you do not leave out the parameter names. In this example, `Selector("sleep::")` is not the same as `Selector("sleep:minutes:")`.
Problem
I've googled but not been able to find out what the swift equivalent to `respondsToSelector:` is. This is the only thing I could find (Swift alternative to respondsToSelector:) but isn't too relevant in my case as its checking the existence of the delegate, I don't have a delegate I just want to check if a new API exists or not when running on the device and if not fall back to a previous version of the api.