Objective-C动态投影?
是否有一个Objective-C等价于C++的dynamic_cast 可以使用以下方法伪造:Objective-C动态投影?,objective-c,Objective C,是否有一个Objective-C等价于C++的dynamic_cast 可以使用以下方法伪造: MyClass *safeObject = [object isKindOfClass: [MyClass class]] ? (MyClass *)originalObject : nil; 但这需要输入很多代码,即使我不需要经常输入 我有点生疏了,这可能不太正确,但是我相信C++中的等价物是: MyClass safeObject = dynamic_
MyClass *safeObject = [object isKindOfClass: [MyClass class]]
? (MyClass *)originalObject : nil;
但这需要输入很多代码,即使我不需要经常输入
<>我有点生疏了,这可能不太正确,但是我相信C++中的等价物是:
MyClass safeObject = dynamic_cast<MyClass>(orginalObject);
MyClass-safeObject=dynamic\u cast(orginalObject);
这里的上下文是一个块,其中参数被定义为一个更通用的类的类型,但在这个块中我“知道”它是一个特定的子类。然而,我不想盲目地用(MyClass*)originalObject
强制转换它,而忽略理论上可能出现的错误
说得清楚一点,虽然我喜欢动态\u cast
,但我也很乐意使用另一种方法来安全地处理这种情况
#define objc_dynamic_cast(obj, cls) \
([obj isKindOfClass:(Class)objc_getClass(#cls)] ? (cls *)obj : NULL)
也别忘了
#include <objc/runtime.h>
如果您愿意使用Objective-C++,您可以非常轻松地编写:
template<typename T> inline T* objc_cast(id from) {
if ([from isKindOfClass:[T class]]) {
return static_cast<T*>(from);
}
return nil;
}
这个版本不太好用,因为你不得不说
UIButton *button = [UIButton cast:someView];
在这两个版本中,如果强制转换失败,则结果值为
nil
。在最坏的情况下,您可以为此编写一个宏。Objective-C为duck类型。老实说,“复杂”的演员阵容有点反对语言。是的,我想我可能问错了问题。无论我问什么问题,答案都是“只需使用NSAssert([object isKindOfClass:[MyClass]],@“blahblah”)
,因为你并不期待它。”:)我希望你不介意,但我包装了你的宏并添加了(cls*)以满足编译器的警告。干得好!由于Xcode在范围内的编辑功能,我不太愿意在这里使用宏,但它似乎工作得非常好。您介意添加一行代码来说明如何使用该宏(对于更环保的外部人员)。谢谢,我加了一个。(H2CO3:如果你觉得我弄乱了你的答案,请随时回复。只是想帮助未来的读者!)考虑到问题的性质,当对象无法安全投射时,代码爆炸不是更好吗?是的,我认为这是解决问题的更好答案。不过,在这一点上,我试图公平对待我实际提出的问题第二个例子正是我想要的。而且非常简单。谢谢。这是instancetype操作符的一个很好的用法,因此编译器和Xcode自动完成可以立即开始使用转换后的类型
@interface NSObject (Cast)
+ (instancetype)cast:(id)from;
@end
@implementation NSObject (Cast)
+ (instancetype)cast:(id)from {
if ([from isKindOfClass:self]) {
return from;
}
return nil;
}
@end
UIButton *button = [UIButton cast:someView];