这种类型转换的使用出现了很多,例如在按钮点击动作中:
UIButton *button = (UIButton *)sender;
我的问题是为什么需要显式强制转换“(UIButton *)”。将“sender”的值分配给变量“button”是否已经有效地将其转换为指向 UIButton 的指针?
这种类型转换的使用出现了很多,例如在按钮点击动作中:
UIButton *button = (UIButton *)sender;
我的问题是为什么需要显式强制转换“(UIButton *)”。将“sender”的值分配给变量“button”是否已经有效地将其转换为指向 UIButton 的指针?
它告诉编译器你知道你在做什么:“我知道sender
技术上不是,UIButon*
但我保证它总是在运行时。”
在objective-c中,通常会编写动作方法,例如
- (void)didAction:(id)sender
该方法可以被任何对象(例如 UIButton、UIControl 等)调用,并期望设置发送者自己。
曾经的对象是一个 id。因此,在该方法中,您有一个 id 类型的变量。如果您确定它是一个按钮,那么您可以转换为 UIButton。
另一种方法是,如果您确定该方法将仅由 UIButton 实例调用,那么您可以将您的操作方法更改为
- (void)didAction:(UIButton *)senderButton
如果这样做,则无需进行投射。
请注意,对于您负责的那种铸件,没有任何问题。如果您不确定,您可以随时检查对象的类别
- (BOOL)isKindOfClass:(Class)aClass
方法。
正如斯蒂芬所说,这并不是真正需要的。
但这是一个风格和良好商业惯例的问题。
顺便说一句,当您省略它时,您会收到警告,而不是错误。只是为了摆脱警告,你可以简单地做:
someObject = (id) anotherObject;
这将适用于对任何类的任何对象的引用。您会看到几乎没有任何铸造实际完成。您总是可以在不强制转换的情况下分配给超类:
objectOfAClass = objectOfSubclassOfA;
底线是,它通过迫使你思考一个非常简短的时刻来思考你在那里实际做的事情,从而帮助你避免错误。