I want to get current method name to use in a format message similar to this one
[NSExeception raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
Also, I want to use _cmd to set associated object. I appreciate any idea.
NSStringFromSelector(_cmd); // Objective-C
print(#function) // Swift 4, 5
There is no Swift equivalent of _cmd
. There is little reason to use it in Swift.
Consider _cmd
in Objective-C. When is it useful? Most of the time, the value of _cmd
would be the same as the name of the method that the code is in, so it is already known at compile time, and there is no need for a runtime value. Here are some possible cases when _cmd
is useful in Objective-C:
_cmd
appears in the macro, then it is inserted into the source where it is used, and so the method name can be used inside the macro. However, such macros do not exist in Swift. Plus macros are compile-time, so a compile-time mechanism like __FUNCTION__
would work similarly.self
and _cmd
, and use it (the same function) as the implementation of multiple methods, by adding it using class_addMethod
and class_replaceMethod
, and the _cmd
inside the function will help distinguish between the different method calls. However, class_addMethod
and class_replaceMethod
are not available in Swift._cmd
will help reveal the actual method name used in the call, which may not match the method that the code is in in the source code, since implementations are swapped. I guess method swizzling may still be possible in Swift, since method_exchangeImplementations
is still available in Swift. But in method swizzling, the method you swap in is tailored for the method it is swapping with, so if it is called, there is no ambiguity which method name is being called.IMP
(implementing function) of a method, and manually call it with a different selector. In this case, the inside of the function can see the different selector in _cmd
. However, you don't have to worry about this in Swift because the methods that get the IMP
are unavailable.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With