Objective c 是否将发件人强制转换为发件人对象类型?

Objective c 是否将发件人强制转换为发件人对象类型?,objective-c,cocoa-touch,Objective C,Cocoa Touch,在下面的代码中,我是否需要将发送者强制转换为UISlider?我真的看不出原因,因为发送方是一个UISlider对象 -(IBAction)sliderChangeGoat:(id)sender { UISlider *slider = sender; // OR UISlider *slider = (UISlider*)sender; NSString *newText = [[NSString alloc] initWithFormat:@"%d", (int)[slide

在下面的代码中,我是否需要将发送者强制转换为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];
}
编辑_001:

我就是这么想的,恰克,你是说?我不确定更改发件人的名称是否是一种不好的形式

-(IBAction)sliderChangeGoat:(UISlider*)slider {
}
非常感谢


gary

显式转换它可能有助于编译器确认您的意图。如果您看到编译器警告,请继续并强制转换

显式转换它可能有助于编译器确认您的意图。如果您看到编译器警告,请继续并强制转换

这没什么区别。id等同于任何其他对象指针类型。使用更具体的类型所做的一切就是允许编译器检查其属性是什么,以及您是否正在发送其声明的类响应的对象消息

如果您确实希望以这种方式静态键入它,您只需将参数本身设置为UISlider*slider。参数名与任何其他参数名一样——它只是一个变量。我经常在委托方法中将其更改为unused,在委托方法中,我不关心发送者,只是为了明确表示,如果我将其他东西连接到它,它将不会更改。正如我所说,UISlider*与id相同,只是它限制了您可以发送的消息,而不会收到警告。

这没有什么区别。id等同于任何其他对象指针类型。使用更具体的类型所做的一切就是允许编译器检查其属性是什么,以及您是否正在发送其声明的类响应的对象消息


如果您确实希望以这种方式静态键入它,您只需将参数本身设置为UISlider*slider。参数名与任何其他参数名一样——它只是一个变量。我经常在委托方法中将其更改为unused,在委托方法中,我不关心发送者,只是为了明确表示,如果我将其他东西连接到它,它将不会更改。正如我所说,UISlider*与id相同,只是它限制了您可以发送哪些消息而不会收到警告。

Objective-C是一种动态语言。在运行时,它将尝试向发送方发送值消息。如果您的发件人是UISlider,它将起作用。正如其他人所说,如果您看到警告,请继续更改方法声明或强制转换发件人,但即使您不这样做,它也会起作用。

Objective-C是一种动态语言。在运行时,它将尝试向发送方发送值消息。如果您的发件人是UISlider,它将起作用。正如其他人所说,如果您看到警告,请继续更改方法声明或强制转换发送方,但即使您不这样做,它也会起作用。

讽刺的是,在发送消息id时,您不会收到编译器警告,只有运行时错误。如果以静态方式键入,则编译器会向您发出警告,因为它更好地理解您的意图。如果一个方法存在多个冲突的定义,例如setSomething:NSNumber*num和setSomething:NSIntegernum,则当您使用id而不是显式静态类型时,可能会收到警告。但总的来说,编译器会用一个静态类型的变量来抱怨你——这就是它的全部意义。很好的解释,Chuck。我当然是指这种类型的警告,但正如您所指出的,当使用id时,肯定有可能得到警告。讽刺的是,当消息传递id时,你不会得到编译器警告,只有运行时错误。如果以静态方式键入,则编译器会向您发出警告,因为它更好地理解您的意图。如果一个方法存在多个冲突的定义,例如setSomething:NSNumber*num和setSomething:NSIntegernum,则当您使用id而不是显式静态类型时,可能会收到警告。但总的来说,编译器会用一个静态类型的变量来抱怨你——这就是它的全部意义。很好的解释,Chuck。我当然是指这种类型的警告,但正如您所指出的,当使用id时,肯定有可能得到警告。我偶尔也见过这些。