2010-01-21 110 views
1

在下面的代碼中,是否需要將發件人投遞給UISlider?無論如何,我無法真正看到發件人是UISlider對象的原因?將發件人強制轉換爲發件人對象類型?

-(IBAction)sliderChangeGoat:(id)sender { 
    UISlider *slider = sender; // OR UISlider *slider = (UISlider*)sender; 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d", (int)[slider value]]; 
    [sliderLabel_003 setText:newText]; 

    if((int)[slider value] > 0) [goatLabel setText:@"Goats:"]; 
    } else [goatLabel setText:@"None:"]; 

    [newText release]; 
} 

EDIT_001:

那是我在想什麼(@chuck),你是什麼意思?我不確定這是不是更改名稱發件人的錯誤形式?

-(IBAction)sliderChangeGoat:(UISlider*)slider { 
} 

千恩萬謝

加里

回答

3

它沒有區別。 id等價於任何其他對象指針類型。所有使用更具體的類型都是允許編譯器檢查它的屬性是什麼,以及你發送它聲明的類響應的對象消息。

如果您確實希望以這種方式靜態輸入,則可以僅使參數本身爲(UISlider *)slider。參數名稱就像任何其他參數名稱 - 它只是一個變量。我經常在委託方法中將其更改爲「未使用」,我不關心發件人,只是爲了明確說明,如果我將其他東西掛鉤,它就不會改變。正如我所說,UISlider*id相同,只是它限制了您可以發送的消息而不會收到警告。

1

鑄造它明確可以幫助編譯器確認你的意圖。如果您看到編譯器警告,請繼續並投射。

+0

諷刺的是,當消息傳遞'id'時,你不會*獲得*編譯器警告,只有運行時錯誤。如果你輸入的是靜態的,那麼編譯器會提醒你,因爲它能更好地理解你的意圖。 – 2010-01-21 22:10:25

+0

這是奎因的一個好點。感謝澄清。 – 2010-01-21 22:12:41

+1

如果某個方法存在多個衝突的定義(例如'setSomething:(NSNumber *)num'和'setSomething:(NSInteger)num'),那麼當您使用'id'時,您可能會收到警告,但不會顯式靜態類型。但是一般來說,編譯器會更多的使用靜態類型變量來抱怨 - 這就是完成這一點的關鍵。 – Chuck 2010-01-21 22:14:08

0

Objective-C是一種動態語言。在運行時,它會嘗試向發送者發送值消息。如果你的發件人是UISlider,它就會起作用。就像其他人說的那樣,如果你看到一個警告繼續,改變方法聲明或者轉換髮送者,但即使你不這樣做,它也會工作。