這種類型的鑄造使用出現了很多,例如在按鈕輕擊動作:在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