当变量已经定义类型时,为什么需要进行类型转换?

时间:2015-05-19 23:24:34

标签: objective-c casting

我有一个自定义的UIViewController,我用它作为popover的内容视图控制器。这个自定义UIViewController定义如下......

glm::vec3 center = (min + max) / 2.0f;
rootNode->translate(-center.x, -center.y, -center.z);

然后我在另一个类中有一个方法,我就像这样引用popover的contentViewController ......

@interface MyCustomViewController : UIViewController <MyCustomDelegate>

因为我已经定义了-(void)someMethod:(UIPopoverController *)popoverController UIViewController<MuCustomDelegate> *theCustomViewController; 是什么,为什么我必须在下一行之后执行此操作...

theCustomViewController

为什么编译器/ XCode编辑器或者其他任何人都不知道委托是什么而不是让我在我已经定义它之后把它投出来

由于

2 个答案:

答案 0 :(得分:5)

根据您的更新,您询问是否需要投射myUIPopOverController.contentViewController

简单 - contentViewController属性的类型为UIViewController *。您无法将其直接分配给UIViewController<MuCustomDelegate> *类型的变量。

添加协议意味着您需要特定类型的UIViewController。编译器不能假设contentViewController碰巧是这样的值。所以你使用演员来告诉编译器,&#34;相信我,我知道它到底是什么&#34;。

答案 1 :(得分:1)

常见的模式是:

// in MyClass.h
@protocol MyClassDelegate;

@interface MyClass : NSObject
@property(weak,nonatomic) id<MyClassDelegate>delegate;
@end

@protocol MyClassDelegate <NSObject>
- (NSInteger)myClassNeedsAnInt:(MyClass *)instanceOfMyClass;
@end

完成后,在MyClass.m中应该很容易说,没有任何进一步的演员:

NSInteger anInt = [self.delegate myClassNeedsAnInt:self];

这个班级的客户说:

// in MyCustomerClass.h or in a private interface in .m
#import "MyClass.h"

@interface MyCustomerClass : NSObject <MyClassDelegate>
@end

在其实现中,将自己设置为委托并实现委托协议:

MyClass *myClassInstance = [[MyClass alloc] init];
myClassInstance.delegate = self;

- (NSInteger)myClassNeedsAnInt:(MyClass *)instanceOfMyClass {
    return 42;
}