Objective-C中的方法语法

Objective-C中的方法语法,objective-c,syntax,methods,Objective C,Syntax,Methods,有人能给我解释一下这个方法声明语法吗?在此函数中,将返回UIPickerView(iPhone上的老虎机UI)的行数。据我所知,该方法名为“pickerView”,并返回NSInteger 它传入一个指向UIPickerview的指针,名为“pickerView”。。。首先,为什么方法的名称与参数的名称相同 接下来是名为component的NSInteger参数,它告诉我们要为哪个组件计算行数。决定方法主体中的逻辑 什么是“行数组件”?它似乎描述了我们正在返回的价值,但是它在参数的中间。 - (

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

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

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

什么是“
行数组件”
?它似乎描述了我们正在返回的价值,但是它在参数的中间。
- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}

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

pickerView:numberOfRowsInComponent:
该方法相当于一个C型函数,如下所示:

编辑:(感谢):


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

我将尝试解释这里的内容,
-(NSInteger)pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component

  • -(NSInteger)

    第一部分指出这是一个返回NSInteger对象的Objective C实例。
    -
    (破折号)表示这是一个实例方法,其中
    +
    表示这是一个方法。括号中的第一个值是方法的返回类型

  • pickerView:

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

  • (UIPickerView*)pickerView

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

  • 行数组件:

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

  • (NSInteger)组件

    这是输入的最后一部分。此处的输入类型为
    NSInteger
    ,具有局部变量名component


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

因此,在这种情况下:

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
numberOfRowsInComponent
外部名称,从外部调用此方法时将使用该名称

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


希望这能澄清一点。

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

void setPersonData( char* name, int age, float height ) {
在Objective-C中,该方法更具描述性(setPersonName:andAge:andHeight:),如


+1-很好的简短描述。有时,如果你把C风格的等效词写成“NSInteger PickerViewNumber of RowsIncomponent(UIPickerView*pickerView,NSInteger component),我会发现人们会感到兴奋。我喜欢你的解释,用C重写要好得多。+1是一个很好的答案。我建议在你的第一点中将“factory”改为“class”,因为+“正式表示类方法。碰巧很多“+”方法都是工厂方法,但这不是正确的定义。谢谢!还有一个问题:如果要像您显示的那样用变量foo和bar向对象myObject发送消息:[myObject pickerView:foo numberOfRowsInComponent:bar];pickerView是否引用了方法名称或参数?两者都没有。它同时引用方法名和参数是一种很好的样式,但完整的方法名实际上是pickerView:numberOfRowsInComponent:。如果您试图调用pickerView:,您将收到一个运行时错误,因为该方法不存在。让我澄清一下:pickerView:部分本身应该引用以下参数,以遵循良好的编码风格。但是,它只占方法名称的1/2。一个更好的例子可能是[myObject setX:foo Y:bar],其中方法是setX:Y:。我知道这个答案很老,但过去几年我一直生活在.NET世界中。我不熟悉Objective C,正在从网络世界过渡到移动行业。我想感谢你对这个问题的解释,它是如此的相关+1根据您的描述,可以将方法名称视为第一个参数的外部名称。这也符合wilczarz下面的评论。该死,我发现这个答案太不正确了。没有什么比参数的外部/内部名称更好的了。它是类型和变量标识符。我想知道为什么每个人都这么努力
void setPersonData( char* name, int age, float height ) {
- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {