什么是快速相当于_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_addMethod
和class_replaceMethod
来添加它,函数内的_cmd
将帮助区分不同的方法调用。 但是,class_addMethod
和class_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
- 添加Swift文件来testing目标没有修复unit testing
- 更改UIImage中某些像素的颜色
- 使用URLRequestConvertible在unit testing中链接错误
- 如何通过标题的第一个字母来创build字典,但忽略“the”或“a / an”等文章
- Swift 3中的十进制到双精度转换
- UICollectionView – 在单元格之间绘制一条线
- 如何从自定义CollectionViewCell推动VC哪些是在TableViewCell上?
- 使用自动布局在CollectionView的CollectionViewCell中自动调整图像大小
- 什么是UnsafeMutablePointer <Void>? 如何修改底层的内存?