当前位置:  开发笔记 > IOS > 正文

目标C中的方法语法

如何解决《目标C中的方法语法》经验,为你挑选了4个好方法。

有人可以为我解释这个方法声明语法吗?在此函数中,返回UIPickerView(iPhone上的老虎机UI)的行数.根据我的理解,Method被称为' 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];
}

locriani.. 356

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 component).但是,由于这是Objective-C,因此其他信息将打包到消息名称中.

(UIPickerView*)pickerView
这部分是输入的一部分.这里的输入是类型的,UIPickerView*并且具有pickerView的局部变量名.

numberOfRowsInComponent:
此部分是消息名称的第二部分.正如您在此处所看到的,消息名称被拆分以帮助指示您传递给接收器的信息.因此,如果我使用变量foo和bar向对象myObject发送消息,我会输入:
[myObject pickerView:foo numberOfRowsInComponent:bar];
而不是C++样式:
myObject.pickerView(foo, bar);.

(NSInteger)component
这是输入的最后一部分.这里的输入是类型,NSInteger并具有组件的局部变量名称.

+1为一个很好的答案.我建议你在第一点将"工厂"改为"班级",因为"+"正式表示一种班级方法.碰巧许多"+"方法都是工厂方法,但这不是正确的定义. (18认同)

谢谢!另外一个问题:如果你要使用变量foo和bar向对象发送消息,就像你展示的那样:[myObject pickerView:foo numberOfRowsInComponent:bar]; pickerView是否引用方法名称或参数? (2认同)

都不是.引用方法名称AND参数是一种很好的方式,但完整的方法名称实际上是pickerView:numberOfRowsInComponent:.如果您尝试调用pickerView:,则会收到运行时错误,因为该方法不存在. (2认同)


e.James.. 52

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

pickerView:numberOfRowsInComponent:

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

编辑:(感谢Jarret Hardie):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)


Karolis.. 29

添加到之前的答案,我只想说Objective-C方法(或者如果您愿意的话,还有消息)具有外部内部参数名称.

所以在这种情况下:

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

numberOfRowsInComponent外部名称,从外部调用此方法时将使用的名称.

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

希望能稍微清理一下.



1> locriani..:

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 component).但是,由于这是Objective-C,因此其他信息将打包到消息名称中.

(UIPickerView*)pickerView
这部分是输入的一部分.这里的输入是类型的,UIPickerView*并且具有pickerView的局部变量名.

numberOfRowsInComponent:
此部分是消息名称的第二部分.正如您在此处所看到的,消息名称被拆分以帮助指示您传递给接收器的信息.因此,如果我使用变量foo和bar向对象myObject发送消息,我会输入:
[myObject pickerView:foo numberOfRowsInComponent:bar];
而不是C++样式:
myObject.pickerView(foo, bar);.

(NSInteger)component
这是输入的最后一部分.这里的输入是类型,NSInteger并具有组件的局部变量名称.


+1为一个很好的答案.我建议你在第一点将"工厂"改为"班级",因为"+"正式表示一种班级方法.碰巧许多"+"方法都是工厂方法,但这不是正确的定义.
谢谢!另外一个问题:如果你要使用变量foo和bar向对象发送消息,就像你展示的那样:[myObject pickerView:foo numberOfRowsInComponent:bar]; pickerView是否引用方法名称或参数?
都不是.引用方法名称AND参数是一种很好的方式,但完整的方法名称实际上是pickerView:numberOfRowsInComponent:.如果您尝试调用pickerView:,则会收到运行时错误,因为该方法不存在.

2> e.James..:

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

pickerView:numberOfRowsInComponent:

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

编辑:(感谢Jarret Hardie):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)



3> Karolis..:

添加到之前的答案,我只想说Objective-C方法(或者如果您愿意的话,还有消息)具有外部内部参数名称.

所以在这种情况下:

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

numberOfRowsInComponent外部名称,从外部调用此方法时将使用的名称.

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

希望能稍微清理一下.



4> wilczarz..:

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

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

在Objective-C中,该方法将更具描述性(setPersonName:andAge:andHeight :),就像

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


为什么setPersonalData(char*andName,int alsoAge,float alsoHeight)没有意义?这完全取决于你对语法的理解,没有关于objc设计师在这里聪明的意图.他们刚刚添加了一堆更多的语法,坦率地说没有任何意义.. :)
你误解了我害怕的答案.setPersonalData(char*andName,int alsoAge,float alsoHeight)是签名,而不是调用.这个函数的调用将是setPersonData("Tom",25,175) - 这并没有多大的说明吗?Obj-C调用看起来像这样:[person setPersonName:@"Tom"andAge:25 andHeight:175];
现在我想起来了,我的回答更多的是投诉而非陈述.我完全同意.
推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有