C中的方法语法

Method Syntax in Objective C

有人能为我解释这个方法声明语法吗?在此函数中,将返回uipickerview(iPhone上的slot machine ui)的行数。据我所知,该方法被称为"EDOCX1"(0),并返回nsinteger。

它传入一个指向名为"pickerView的uipikerview的指针…首先,为什么方法调用的名称与参数相同?

接下来是名为component的nsinteger参数,它告诉我们要为哪个组件计算行。决定方法主体中哪个的逻辑。

"EDOCX1"(2)是什么?它似乎描述了我们返回的值,但它在参数的中间。

1
2
3
4
5
6
7
8
- (NSInteger) pickerView:(UIPickerView *)pickerView
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}

客观性C方法是一种自我记录的方法,它借鉴了Smalltalk的丰富传统。

我来解释一下你这里有什么,埃多克斯1〔0〕。

  • - (NSInteger)第一部分指示这是一个返回nsinteger对象的目标C实例方法。EDOCX1(dash)表示这是一个实例方法,其中+表示这是一个类方法。括号中的第一个值是方法的返回类型。

  • pickerView:这部分是消息名称的一部分。本例中的完整消息名称是pickerView:numberOfRowsInComponent:。Objective-C运行时获取此方法信息并将其发送给指定的接收者。在纯C中,这个看起来像NSInteger pickerView(UIPickerView* pickerView, NSInteger component)。但是,由于这是Objective-C,所以在消息名中打包了额外的信息。

  • (UIPickerView*)pickerView这部分是输入的一部分。这里的输入是UIPickerView*类型,局部变量名为pickerview。

  • numberOfRowsInComponent:这部分是消息名称的第二部分。正如您在这里看到的,消息名称被拆分,以帮助指示您传递给接收者的信息。因此,如果我要用变量foo和bar消息对象myObject,我将键入:[myObject pickerView:foo numberOfRowsInComponent:bar];与C++风格相反:myObject.pickerView(foo, bar);

  • (NSInteger)component这是输入的最后一部分。这里的输入是NSInteger类型,并且有一个组件的局部变量名。


在objective-c中,方法的名称由声明中不是参数和类型的所有部分组成。因此,此方法的名称为:

1
pickerView:numberOfRowsInComponent:

该方法相当于C样式的函数,如下所示:

编辑:(感谢Jarret Hardie):

1
NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)


除了前面的答案之外,我想说的是,Objective-C方法(或者消息,如果您愿意的话)有外部和内部参数名。

所以在这种情况下:

1
2
- (NSInteger) pickerView:(UIPickerView *)pickerView
 numberOfRowsInComponent:(NSInteger)component

numberOfRowsInComponent是外部名称,从外部调用此方法时将使用该名称。

component是参数的内部名称,您用来从方法内部引用参数的名称。

希望能澄清一点。


在我看来,objective-c方法签名更像句子。每个参数在方法名称中都应有一个部分。例如,在C中,我们可以有一个方法(setPersonData)来设置关于人的一些信息:

1
void setPersonData( char* name, int age, float height ) {

在Objective-C中,该方法更具描述性(setpersonname:andage:andheight:),比如

1
- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {