当前位置:  开发笔记 > 后端 > 正文

如何在Objective-C中转换对象

如何解决《如何在Objective-C中转换对象》经验,为你挑选了3个好方法。

有没有办法在objective-c中转换对象,就像在VB.NET中转换对象的方式一样?

例如,我正在尝试执行以下操作:

// create the view controller for the selected item
FieldEditViewController *myEditController;
switch (selectedItemTypeID) {
    case 3:
        myEditController = [[SelectionListViewController alloc] init];
        myEditController.list = listOfItems;
        break;
    case 4:
        // set myEditController to a diff view controller
        break;
}

// load the view
[self.navigationController pushViewController:myEditController animated:YES];
[myEditController release]; 

但是我收到编译器错误,因为'list'属性存在于SelectionListViewController类中,但不存在于FieldEditViewController上,即使SelectionListViewController继承自FieldEditViewController.

这是有道理的,但有没有办法将myEditController转换为SelectionListViewController,以便我可以访问'list'属性?

例如在VB.NET中,我会这样做:

CType(myEditController, SelectionListViewController).list = listOfItems

谢谢您的帮助!



1> Jim Puls..:

请记住,Objective-C是C的超集,因此类型转换就像在C中一样工作:

myEditController = [[SelectionListViewController alloc] init];
((SelectionListViewController *)myEditController).list = listOfItems;


或者"记住,Objective-C的工作方式与Java类似,只记得在指向Obj-C对象的变量中添加星号."

2> Sijmen Mulde..:
((SelectionListViewController *)myEditController).list

更多例子:

int i = (int)19.5f; // (precision is lost)
id someObject = [NSMutableArray new]; // you don't need to cast id explicitly


一般来说这是正确的; 您不需要在消息表达式中转换id.但是当使用点语法来访问和设置属性时,必须使用具体类型,而不仅仅是id,因此编译器知道实际生成的方法调用.(对于具有相同名称的属性,它可能不同.)

3> Alexander Va..:

Objective-C中的类型转换很简单:

NSArray *threeViews = @[[UIView new], [UIView new], [UIView new]];
UIView *firstView = (UIView *)threeViews[0];

但是,如果第一个对象不是UIView并且您尝试使用它会发生什么:

NSArray *threeViews = @[[NSNumber new], [UIView new], [UIView new]];
UIView *firstView = (UIView *)threeViews[0];
CGRect firstViewFrame = firstView.frame; // CRASH!

它会崩溃.并且很容易在这种情况下找到这样的崩溃,但如果这些行在不同的类中并且第三行在100种情况下仅执行一次该怎么办呢.我打赌你的客户会发现这次崩溃,而不是你!一个看似合理的解决方案是提前崩溃,如下所示:

UIView *firstView = (UIView *)threeViews[0];
NSAssert([firstView isKindOfClass:[UIView class]], @"firstView is not UIView");

那些断言看起来不太好,所以我们可以用这个方便的类别来改进它们:

@interface NSObject (TypecastWithAssertion)
+ (instancetype)typecastWithAssertion:(id)object;
@end


@implementation NSObject (TypecastWithAssertion)

+ (instancetype)typecastWithAssertion:(id)object {
    if (object != nil)
        NSAssert([object isKindOfClass:[self class]], @"Object %@ is not kind of class %@", object, NSStringFromClass([self class]));
    return object;
}

@end

好得多:

UIView *firstView = [UIView typecastWithAssertion:[threeViews[0]];

PS对于集合类型安全Xcode 7比类型转换更好 - 泛型

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有