gpt4 book ai didi

Objective-C dynamic_cast?

转载 作者:太空狗 更新时间:2023-10-30 03:21:29 28 4
gpt4 key购买 nike

是否存在与 C++ 的 dynamic_cast 等效的 Objective-C?

它可以用这个来伪造:

MyClass *safeObject = [object isKindOfClass: [MyClass class]]
? (MyClass *)originalObject : nil;

但这需要输入很多代码,即使我不需要经常输入它也是如此。

我有点生疏,所以这可能不太正确,但我相信 C++ 中的等价物是:

MyClass safeObject = dynamic_cast<MyClass>(orginalObject);

这里的上下文是一个 block ,其中参数被定义为更通用类的类型,但在这个 block 中我“知道”它是一个特定的子类。尽管如此,我不想只是盲目地使用 (MyClass *)originalObject 来转换它并忽略理论上可能的错误。

需要明确的是,虽然我喜欢 dynamic_cast,但我也很乐意使用替代方法来安全地处理这种情况。

最佳答案

如果你愿意使用 Objective-C++,你可以很容易地写出这个:

template<typename T> inline T* objc_cast(id from) {
if ([from isKindOfClass:[T class]]) {
return static_cast<T*>(from);
}
return nil;
}

这应该与 dynamic_cast<> 完全一样obj-c 对象除外。


如果你想坚持使用 vanilla Obj-C,你可以使用 NSObject 上的类方法获得类似的行为。 :

@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];

在两个版本中,结果值为 nil如果转换失败。

关于Objective-C dynamic_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557756/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com