什么是快速相当于_cmd?

Lon*_*gNV 18 objective-c selector ios swift

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

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

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

Huy*_*Inc 36

NSStringFromSelector(_cmd); // Objective-C

print(__FUNCTION__) // Swift 2

print(#function) // Swift 3
Run Code Online (Sandbox Code Playgroud)

  • "__FUNCTION__"将被弃用,并将从Swift 3中删除,因此,请使用:#function (2认同)
  • 确切的调试标识符如`__FILE__`,`__LINE__`,`_COLUMN__`和`__FUNCTION__`已被**Swift 2.2*中的`#file`,`#line`,`#column`和`#function`取代.*. (2认同)

new*_*cct 1

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

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

  • 在宏中。宏在代码中进行扩展,因此如果_cmd出现在宏中,则会将其插入到使用它的源中,因此可以在宏内部使用方法名称。然而,Swift 中不存在这样的宏。另外,宏是编译时的,因此编译时机制的__FUNCTION__工作原理类似。
  • self您可以定义一个接受和 的C 函数_cmd,并将其(同一个函数)用作多个方法的实现,通过使用class_addMethod和添加它class_replaceMethod_cmd函数内部将有助于区分不同的方法调用。但是,class_addMethodclass_replaceMethod在 Swift 中不可用。
  • 方法调配也是一个扰乱方法实现的过程。由于在 swizzling 中交换了两个方法的实现,因此_cmd将有助于揭示调用中使用的实际方法名称,该名称可能与源代码中代码所在的方法不匹配,因为实现已交换。我猜想方法调配在 Swift 中仍然是可能的,因为method_exchangeImplementations它在 Swift 中仍然可用。但在方法调配中,您交换的方法是针对它所交换的方法量身定制的,因此,如果调用它,则不会存在调用哪个方法名称的歧义。
  • IMP在您手动获取方法(实现函数)并使用不同选择器手动调用它的情况下。在这种情况下,函数内部可以看到 中不同的选择器_cmd。但是,在 Swift 中您不必担心这一点,因为获取 的方法IMP不可用。