我想获取当前的方法名称,以便在与此类似的格式消息中使用
[NSExeception raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
另外,我想使用_cmd设置关联对象。我很感激。
答案 0 :(得分:36)
NSStringFromSelector(_cmd); // Objective-C
print(__FUNCTION__) // Swift 2
print(#function) // Swift 3
答案 1 :(得分:1)
没有Swift等价的_cmd
。没有理由在Swift中使用它。
考虑Objective-C中的_cmd
。什么时候有用?大多数情况下,_cmd
的值将与代码所在方法的名称相同,因此在编译时已知,并且不需要运行时值。以下是_cmd
在Objective-C中有用的一些可能情况:
_cmd
,则将其插入到使用它的源中,因此可以在宏内部使用方法名称。但是,Swift中不存在这样的宏。 Plus宏是编译时的,因此像__FUNCTION__
这样的编译时机制也可以起到类似的作用。self
和_cmd
的C函数,并使用它(相同的函数)作为多个方法的实现,方法是使用class_addMethod
和{{ 1}},函数内的class_replaceMethod
将有助于区分不同的方法调用。但是,_cmd
和class_addMethod
在Swift中不可用。class_replaceMethod
将有助于揭示调用中使用的实际方法名称,这可能与代码在源代码中的方法不匹配,因为实现是交换的。我想在Swift中仍然可以进行方法调整,因为_cmd
在Swift中仍然可用。但是在方法调配中,你交换的方法是为它交换的方法量身定做的,所以如果调用它,那么调用方法名称就没有歧义。method_exchangeImplementations
(实现功能),并使用其他选择器手动调用它。在这种情况下,函数内部可以在IMP
中看到不同的选择器。但是,您不必在Swift中担心这一点,因为获取_cmd
的方法不可用。