Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C动态投影?_Objective C - Fatal编程技术网

Objective-C动态投影?

Objective-C动态投影?,objective-c,Objective C,是否有一个Objective-C等价于C++的dynamic_cast 可以使用以下方法伪造: MyClass *safeObject = [object isKindOfClass: [MyClass class]] ? (MyClass *)originalObject : nil; 但这需要输入很多代码,即使我不需要经常输入 我有点生疏了,这可能不太正确,但是我相信C++中的等价物是: MyClass safeObject = dynamic_

是否有一个Objective-C等价于C++的dynamic_cast

可以使用以下方法伪造:

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