【问题标题】:How to use id variable in objective-c?如何在objective-c中使用id变量?
【发布时间】:2010-08-14 00:51:33
【问题描述】:

我有一个包含两种类型对象的 NSArray。让我们称它们为 Apple 和 Orange。

Apple *myApple = [self.searchQueryResults objectAtIndex:indexPath.row];

在构建单元格时,我不知道数组中的类型是苹果还是橙子。如何使用泛型 id 类型来存储对象,然后进行适当的转换?

【问题讨论】:

    标签: iphone objective-c cocoa-touch casting types


    【解决方案1】:

    你可以使用isKindOfClass:(Class)aClass来测试类类型:

    if ([myObject isKindOfClass:[Apple class]])
       // do stuff
    

    我不知道你为什么认为你必须施放。 NSArray 不关心你在其中存储什么类型的对象,所以当你把它拉出来时,它仍然是同一个对象。但是如果你愿意,你仍然可以通过做类似的事情来投射

    Apple *myApple = (Apple *)myObject;
    

    无论如何,知道类的类型应该足以让您采取适当的行动,因为我的理解是您在同一个表中显示两种类型,您真正需要做的就是适当地显示它们的不同属性.

    【讨论】:

    • 你不需要强制转换,但是如果你使用object.property来使用对象的属性,你需要将它强制转换为合适的类型。否则,您可以只使用 [object property] 和 [object setProperty:x] 来访问属性。
    • @lucius:这就是为什么你应该这样做! :P
    【解决方案2】:

    不要在 NSArray 中混合类的类型。

    你可以这样做,你可以检查类型 - 但这是一个非常糟糕的主意,除非它们都是同一个子类树的一部分(比如,都是 Fruit 的派生词)。然后至少有东西在里面看可以推测它可能是什么类型的水果,并检查细节。

    基本上,如果您不在容器类中混合类型,那么您将省去很多麻烦,当某个地方出于某种原因有一些代码数字时,那里只有苹果,但有人扔了一个梨。然后,砰!

    【讨论】:

    • 我认为更好的表述方式是:不要在容器中混合类型,除非您打算以某种方式多态地使用它们。当它们既不共享基类也不共享协议时,我可以想到几种方法来多态地使用不同类型的对象。不过,总的来说,我同意你的意见。 (顺便说一句,我不一定说形式多态。)
    • 这是一种更好的表达我想说的话的方式,虽然我试图保持简单......你说的更准确,而且我试图保持事情的方式。
    猜你喜欢
    • 2012-04-02
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多