这种类型的铸造使用出现了很多,例如在按钮轻击动作:在Objective-C中,为什么在分配给指定类型的变量时需要进行转换?
UIButton *button = (UIButton *)sender;
我的问题是,为什么显式类型转换“(UIButton的*)”是必要的。不会将“sender”的值赋给变量“button”已经有效地将它转换为指向UIButton的指针?
这种类型的铸造使用出现了很多,例如在按钮轻击动作:在Objective-C中,为什么在分配给指定类型的变量时需要进行转换?
UIButton *button = (UIButton *)sender;
我的问题是,为什么显式类型转换“(UIButton的*)”是必要的。不会将“sender”的值赋给变量“button”已经有效地将它转换为指向UIButton的指针?
正如斯蒂芬所说,这不是真的需要。
但这是一个风格和良好的商业惯例quesiton。
顺便说一句,当你忽略它,你会得到一个警告,而不是一个错误。 只是为了摆脱警告你可以简单地做:
someObject = (id) anotherObject;
将与任何类的任何对象引用。你会发现几乎没有任何演员能够完成。 可以八方通分配给超不投:
objectOfAClass = objectOfSubclassOfA;
底线是,它可以帮助你通过迫使你想想你实际上是在做什么,有一个非常短暂的瞬间避免错误。
它会告诉你知道你在做什么,编译器:“我知道sender
技术上不是UIButon*
,但我承诺,它总是会在运行时。”
在Objective-C,通常写动作的方法等
- (void)didAction:(id)sender
此方法可以通过任何对象(例如。的UIButton,UIControl等)被调用,并且组预期发送者的自我。
永远的对象是一个id。所以在这个方法中你有一个id类型的变量。如果你确定它是一个按钮,那么你可以投到UIButton。
另一种方式是,如果你是确保该方法将只通过一个UIButton实例调用,然后你可以改变你的操作方法对
- (void)didAction:(UIButton *)senderButton
如果你这样做的话,你不需要投。
请注意,对于那种你负责的铸件,没有任何问题。如果您不确定您是否可以随时查看该物品的类别,请使用
- (BOOL)isKindOfClass:(Class)aClass
方法。
迄今为止所有出色的答案,但我选择这一个,因为有关编译器警告的细节。只是重申一下:分配给一个超类(不投射)会产生** no **警告;分配给一个子类(没有投射)**会产生一个警告。例如'UILabel *标签; UIView * view = label;'(no warning); 'UIView *视图; UILabel * label = view;'(警告)。 – bfalling 2013-02-20 17:16:57