什么是快速相当于_cmd?

我想要得到当前的方法名称,以类似于这个格式的消息

[NSExeception raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] 

另外,我想用_cmd来设置关联的对象。 我很欣赏任何想法。

没有_cmd Swift等价物。 在Swift中使用它没有什么理由。

考虑Objective-C中的_cmd 。 什么时候有用? 大多数情况下, _cmd的值将与代码所在的方法的名称相同,因此在编译时已知该方法,并且不需要运行时值。 在Objective-C中_cmd有用时,有以下_cmd情况:

  • 在一个macros。 macros在代码中被扩展了,所以如果在macros中出现_cmd ,那么它被插入到它所使用的源中,所以方法名可以在macros内部使用。 但是,这样的macros在Swift中不存在。 Plusmacros是编译时,所以象__FUNCTION__这样的编译时机制可以类似地工作。
  • 您可以定义一个C函数,它使用self_cmd ,并使用它(相同的函数)作为多个方法的实现,通过使用class_addMethodclass_replaceMethod来添加它,函数内的_cmd将帮助区分不同的方法调用。 但是, class_addMethodclass_replaceMethod在Swift中不可用。
  • 方法混搭也是一个过程,与方法的实施混淆。 由于在调换过程中交换了两个方法的实现, _cmd将帮助显示调用中使用的实际方法名称,这可能与代码在源代码中的方法不匹配,因为实现被交换。 我想方法swizzling可能仍然可以在Swift中,因为method_exchangeImplementations在Swift中仍然可用。 但是在方法debugging中,交换的方法是为它所交换的方法量身定做的,所以如果调用的方法不存在被称为方法名的歧义。
  • 在手动获取方法的IMP (实现函数)的情况下,手动调用另一个select器。 在这种情况下,函数的内部可以在_cmd看到不同的select器。 但是,你不必担心这在Swift中,因为获取IMP的方法是不可用的。
 NSStringFromSelector(_cmd); // Objective-C print(__FUNCTION__) // Swift 2 print(#function) // Swift 3