【问题标题】:how to cast or set an object of type id to another type like UIImageView or UIView如何将 id 类型的对象转换或设置为另一种类型,如 UIImageView 或 UIView
【发布时间】:2024-01-16 12:24:01
【问题描述】:

在下面的代码中,我遍历条目,它们可能是 UIView 或 UIImageView 类型。我想检查 uiComponent 是否属于上述类型,然后我想继续在代码中使用该 uiComponent 是UIView还是UIImageView?

我死记硬背下面的代码,但我不能使用指针对象

uiComponent

在进行类型转换之后??

请告诉我如何将 uiComponent 对象输入到 UIView 或 UIImageView 类中并继续使用它进行编程

代码

 for (id uiComponent in uiviews) {
            UIView *uiView;
            UIImage *uiImageView;

         if ([AQSViewHelper isEntryOfTypeUIView:uiComponent]) {
                uiComponent = (UIView *)uiComponent;
         }
            if ([AQSViewHelper isEntryOfTypeUIImageView:uiComponent]) {
            uiComponent = (UIImageView *)uiComponent;
        }

         if (![uiComponent isHidden]) {
            …
    ..
    …
            }

【问题讨论】:

  • isKindOfClass:? *.com/questions/3653929/… ?
  • 您在这里的投射根本没有做任何事情(但也没有必要)。我怀疑你有不同的问题。当你说“我不能使用指针对象”时,你是什么意思?您的代码还将 uiImageView 定义为 UIImage(而不是 UIImageView)。由于从未使用过该变量,因此尚不清楚这是否是故意的。请注意,UIImageView 也是 UIView,因此在所有情况下它都是 UIView。如果它是 UIImageView 与不是,您打算以何种方式以不同的方式使用这些元素?为什么不能总是把它当作 UIView 对待?
  • 当我说强制转换什么都不做时,我的意思是(UIView *)uiComponent 中的(UIView *) 对运行时没有影响。它只是告诉编译器“我知道我在这里做什么;请不要发出警告。”在赋值行之后,uiComponent 与之前的值完全相同,编译器仍将其视为id 类型。它与代码行uiComponent = uiComponent; 相同

标签: objective-c uiview casting uiimageview


【解决方案1】:

根据类型设置你的本地对象,如果不是 nil 就使用它:

for (id uiComponent in uiviews) {
    UIView *uiView;
    UIImageView *uiImageView;

    if ([AQSViewHelper isEntryOfTypeUIView:uiComponent]) {
        uiView = (UIView *)uiComponent;
    }
    if ([AQSViewHelper isEntryOfTypeUIImageView:uiComponent]) {
        uiImageView = (UIImageView *)uiComponent;
    }

    if (uiView) {
        // do what you want because it's a UIView
        if ([uiView isHidden]) {
            // ...
        }
        // etc ...
    }
    if (uiImageView) {
        // do what you want because it's a UIView
        if ([uiImageView isHidden]) {
            // ...
        }
        // etc ...
    }
}

或者,既然你已经在 if 块中,你可以在那里做:

for (id uiComponent in uiviews) {
    if ([AQSViewHelper isEntryOfTypeUIView:uiComponent]) {
        // do what you want because it's a UIView
        UIView *uiView = (UIView *)uiComponent;
        if ([uiView isHidden]) {
            // ...
        }
        // etc ...
    }
    if ([AQSViewHelper isEntryOfTypeUIImageView:uiComponent]) {
        // do what you want because it's a UIImageView
        UIImageView *uiImageView = (UIImageView *)uiComponent;
        if ([uiImageView isHidden]) {
            // ...
        }
        // etc ...
    }
}

【讨论】:

  • thx..你能告诉我为什么不能声明 UIView *uiView; UIImage *uiImageView;在 if 语句之前
  • 真的没有区别。如果您在if 块之外声明它们,您可以在if 块之外使用它们。在不知道你想用它们做什么的情况下,在需要的地方声明它们似乎更“有条理”。
  • 请你看看这个问题好吗:*.com/questions/58771956/…