什么是快速相当于_cmd?

时间:2014-06-30 03:44:21

标签: ios objective-c swift selector

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

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

另外,我想使用_cmd设置关联对象。我很感激。

2 个答案:

答案 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将有助于区分不同的方法调用。但是,_cmdclass_addMethod在Swift中不可用。
  • 方法调配也是一个与方法实现相混淆的过程。由于在调配中交换了两种方法的实现,class_replaceMethod将有助于揭示调用中使用的实际方法名称,这可能与代码在源代码中的方法不匹配,因为实现是交换的。我想在Swift中仍然可以进行方法调整,因为_cmd在Swift中仍然可用。但是在方法调配中,你交换的方法是为它交换的方法量身定做的,所以如果调用它,那么调用方法名称就没有歧义。
  • 如果您手动获取方法的method_exchangeImplementations(实现功能),并使用其他选择器手动调用它。在这种情况下,函数内部可以在IMP中看到不同的选择器。但是,您不必在Swift中担心这一点,因为获取_cmd的方法不可用。