我必须在每条线上投射吗?

时间:2011-05-26 11:40:30

标签: objective-c cocoa-touch cocoa

我一直在通过在Objective C中创建一个简单的应用程序来自学编程。今天,我遇到了一个问题,我必须编写一个方法,它不知道它将获得什么类型的对象。在谷歌的帮助下,我很高兴发现了一种叫做“铸造”的东西。 :)

我正在使用铸造:

- (void)aCustomViewControllerNeedsToChangeStuff:(id)viewController
{
    ((SpecialViewController *)viewController).aProperty = somethingInteresting;
    ((SpecialViewController *)viewController).anotherProperty = somethingElse;
    ((SpecialViewController *)viewController).yetAnotherProperty = moreStuff;
}

我是否必须在这样的每一行上进行转换,或者是否有一种方法可以在方法范围内转换“viewController”一次,以使我的代码更整洁?

3 个答案:

答案 0 :(得分:7)

您可以将控制器转换为临时变量并使用它(也添加了类型检查 - 以防万一):

- (void)aCustomViewControllerNeedsToChangeStuff:(id)viewController
{
    if ([viewController isKindOfClass:[SpecialViewController class]]){
        SpecialViewController *special = (SpecialViewController *)viewController;
        special.aProperty = somethingInteresting;
        special.anotherProperty = somethingElse;
        special.yetAnotherProperty = moreStuff;
    }
}

答案 1 :(得分:2)

怎么样:

- (void)aCustomViewControllerNeedsToChangeStuff:(id)viewController
{
    SpecialViewController * controller = (SpecialViewController *)viewController;
    controller.aProperty = somethingInteresting;
    controller.anotherProperty = somethingElse;
    controller.yetAnotherProperty = moreStuff;
}

答案 2 :(得分:2)

使用一个变量,如

  SpecialViewController *tempController = (SpecialViewController *)viewController;

使用此变量来访问

之类的值
tempController.aProperty