一尘不染

相当于_cmd的快捷方式是多少?

swift

我想获得当前的方法名称,以便在与此格式相似的格式消息中使用

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

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


阅读 255

收藏
2020-07-07

共1个答案

一尘不染

没有与的Swift等效项_cmd。没有理由在Swift中使用它。

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

  • 在宏中。该宏在代码中展开,因此,如果_cmd出现在宏中,则将其插入使用它的源中,因此可以在宏内部使用方法名称。但是,这样的宏在Swift中不存在。Plus宏是编译时的,因此类似的编译时机制__FUNCTION__也可以类似地工作。
  • 您可以定义一个采用self和的C函数_cmd,并将其(与同一方法一起使用)作为多种方法的实现,方法是使用class_addMethod和将其添加到函数中class_replaceMethod_cmd该函数内部将有助于区分不同的方法调用。但是,class_addMethod并且class_replaceMethod在Swift中不可用。
  • 方法混乱也是与方法实现混在一起的过程。由于在交换中交换了两个方法的实现,_cmd将有助于显示调用中使用的实际方法名称,这可能与源代码中代码所在的方法不匹配,因为实现被交换了。我猜方法在Swift中仍然可能出现混乱,因为在Swift method_exchangeImplementations中仍然可用。但是在方法混乱中,要交换的方法是针对与其交换的方法量身定制的,因此,如果调用了该方法,则不会混淆哪个方法的名称被调用。
  • 如果您手动获取方法的IMP(实现函数),然后使用其他选择器手动调用它。在这种情况下,函数内部可以看到中的其他选择器_cmd。但是,您不必担心在Swift中会因为获取的IMP方法不可用而担心。
2020-07-07