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)
没有 Swift 等价物_cmd。没有什么理由在 Swift 中使用它。
考虑_cmd一下 Objective-C。什么时候有用?大多数时候, 的值与_cmd代码所在方法的名称相同,因此在编译时就已经知道,并且不需要运行时值。以下是一些_cmd在 Objective-C 中有用的可能情况:
_cmd出现在宏中,则会将其插入到使用它的源中,因此可以在宏内部使用方法名称。然而,Swift 中不存在这样的宏。另外,宏是编译时的,因此编译时机制的__FUNCTION__工作原理类似。self您可以定义一个接受和 的C 函数_cmd,并将其(同一个函数)用作多个方法的实现,通过使用class_addMethod和添加它class_replaceMethod,_cmd函数内部将有助于区分不同的方法调用。但是,class_addMethod和class_replaceMethod在 Swift 中不可用。_cmd将有助于揭示调用中使用的实际方法名称,该名称可能与源代码中代码所在的方法不匹配,因为实现已交换。我猜想方法调配在 Swift 中仍然是可能的,因为method_exchangeImplementations它在 Swift 中仍然可用。但在方法调配中,您交换的方法是针对它所交换的方法量身定制的,因此,如果调用它,则不会存在调用哪个方法名称的歧义。IMP在您手动获取方法(实现函数)并使用不同选择器手动调用它的情况下。在这种情况下,函数内部可以看到 中不同的选择器_cmd。但是,在 Swift 中您不必担心这一点,因为获取 的方法IMP不可用。| 归档时间: |
|
| 查看次数: |
4791 次 |
| 最近记录: |