我想获取当前方法名称,用于类似这个的格式化消息中
[NSExeception raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
此外,我想使用_cmd来设置相关对象。感谢任何想法。
我想获取当前方法名称,用于类似这个的格式化消息中
[NSExeception raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
此外,我想使用_cmd来设置相关对象。感谢任何想法。
NSStringFromSelector(_cmd); // Objective-C
print(#function) // Swift 4, 5
__FILE__
、__LINE__
、__COLUMN__
和__FUNCTION__
这样的调试标识符已被替换为#file
、#line
、#column
和#function
。 - cherrmanncom_cmd
是一个选择器类型,而 #function
不是 #selector
类型。 - eonil在Swift中没有与_cmd
相对应的东西。在Swift中很少有使用它的理由。
考虑Objective-C中的_cmd
。什么时候会用到它?大多数情况下,_cmd
的值将与代码所在的方法的名称相同,因此在编译时已知,无需运行时值。以下是一些可能在Objective-C中使用_cmd
的情况:
_cmd
出现在宏中,则会将其插入到使用它的源代码中,因此方法名称可以在宏中使用。但是,在Swift中不存在这样的宏。此外,宏是编译时的机制,因此类似于__FUNCTION__
的编译时机制将起到类似的作用。self
和_cmd
的C函数,并将其用作多个方法的实现,通过使用class_addMethod
和class_replaceMethod
添加它,函数内部的_cmd
将有助于区分不同的方法调用。但是,在Swift中无法使用class_addMethod
和class_replaceMethod
。_cmd
将有助于显示调用中使用的实际方法名称,该名称可能与源代码中代码所在的方法不匹配,因为实现已经被交换。我想在Swift中仍然可能进行方法交换,因为method_exchangeImplementations
在Swift中仍然可用。但是,在方法交换中,您交换的方法是针对与其交换的方法量身定制的,因此如果调用它,则不会存在调用哪个方法名称的歧义。IMP
(实现函数)并使用不同的选择器手动调用它的情况下。在这种情况下,函数内部可以看到_cmd
中的不同选择器。但是,在Swift中您无需担心这个问题,因为获取IMP
的方法不可用。
__FUNCTION__
是一个Swift语言中的特殊标识符,用于返回当前函数的名称。 - Bryan Chen