Objective-C 中的方法语法

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

它传入一个名为‘ pickerView’的 UIPickerview 指针... ... 首先,为什么方法的名称与参数的名称相同?

接下来有一个名为 Component 的 NSInteger 参数,它告诉我们要为哪个组件计算行数。决定哪一个在方法体中的逻辑。

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

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


return[self.zips count];
}
98989 次浏览

在 Objective-C 中,方法的名称由声明的所有非参数和类型部分组成。因此,这个方法的名称应该是:

pickerView:numberOfRowsInComponent:

这个方法等效于一个 C 风格的函数,它看起来如下:

编辑: (感谢 Jarret Hardie) :

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

Objective-C 方法旨在自我记录,它们借鉴了 Smalltalk 的丰富传统。

我会试着解释你这里有什么,-(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component


  • 第一部分指出这是一个返回 NSInteger 对象的 ObjectC例子方法。-(破折号)表示这是一个 例子方法,其中 +表示这是一个 同学们方法。括号中的第一个值是方法的返回类型。


  • 这部分是 信息名称的一部分。本例中的 完整信息名称pickerView:numberOfRowsInComponent:。Objective-C 运行时获取此方法信息并将其发送给指定的接收方。在纯 C 中,这看起来像
    但是,因为这是 Objective-C,所以额外的信息被打包到消息名称中

  • 这部分是 输入的一部分。这里的输入类型为 UIPickerView*,并且具有一个名为 pickerView 的本地变量名。


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


  • 这是 输入的最后一部分。这里的输入类型为 NSInteger,并且有一个局部变量名为 Component。

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

因此,在这种情况下:

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

numberOfRowsInComponent外部名称,从外部调用此方法时要使用的名称。

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

希望这能让你清醒一点。

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

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

在 Objective-C 中,方法将更具描述性(SetPersonName: 和年龄: 和身高:) ,如

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