Objective C中的方法语法

有人可以解释这个方法的声明语法吗? 在这个函数中,UIPickerView(iPhone上的老虎机UI)的行数被返回。 从我的理解,该方法被称为“ pickerView ”,并返回一个NSInteger。

它传入一个指向UIPickerview的指针,称为“ pickerView ”…首先,为什么该方法与参数名称相同?

接下来是一个名为component的NSInteger参数,告诉我们哪个组件正在计算行数。 确定方法体内的逻辑。

什么是“ numberOfRowsInComponent ? 它似乎描述了我们正在返回的价值,但它是在参数的中间。

 - (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == kStateComponent) return [self.states count]; return[self.zips count]; } 

Objective-C方法被devise为自我logging,并且借鉴了Smalltalk的丰富传统。

我将尝试解释你在这里, -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component

  • - (NSInteger)
    这第一部分表明这是一个返回NSInteger对象的Objective C 实例方法。 - (短划线)表示这是一个实例方法,其中a +表示这是一个方法。 括号中的第一个值是方法的返回types。

  • pickerView:
    这部分是消息名称的一部分。 在这种情况下, 完整的消息名称pickerView:numberOfRowsInComponent: Objective-C运行库获取这个方法信息并将其发送给指定的接收者。 在纯C中,这看起来像
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component) 。 但是,由于这是Objective-C,附加信息被打包到消息名称中。

  • (UIPickerView*)pickerView
    这部分是input的一部分。 这里的input的types是UIPickerView*并且有一个局部variables名称pickerView。

  • numberOfRowsInComponent:
    这部分是消息名称的第二部分。 正如你在这里看到的,消息名称被分开以帮助指出你传递给接收者的信息。 因此,如果我要用variablesfoo和bar发送一个对象myObject,我会input:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    而不是C ++风格:
    myObject.pickerView(foo, bar);

  • (NSInteger)component
    这是input的最后部分。 这里的input是NSIntegertypes的,具有组件的局部variables名称。

在Objective-C中,方法的名称由声明中不是参数和types的所有部分组成。 因此这个方法的名字是:

 pickerView:numberOfRowsInComponent: 

该方法将等同于如下所示的C风格函数:

编辑:(感谢Jarret Hardie ):

 NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component) 

添加到以前的答案,我只想说,Objective-C方法(或消息,如果你喜欢)有外部内部参数名称。

所以在这种情况下:

 - (NSInteger)pickerView:(UIPickerView *)pickerView 
  numberOfRowsInComponent:(NSInteger的)组分

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

component是参数的内部名字 – 你用来从方法内部引用参数的名字。

希望清除它的提高。

在我看来,Objective-C方法签名更像是句子。 每个参数在方法的名字中都是值得的。 例如,在C中我们可以有一个方法( setPersonData )来设置一些关于person的信息:

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

而在Objective-C中,这个方法会更具描述性( setPersonName:andAge:andHeight:) ,就像

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