Objective c 头文件中许多方法的声明

Objective c 头文件中许多方法的声明,objective-c,Objective C,我正在努力学习obj-c,但有一点我不明白。我知道一些c#所以有人能试着用c#y的方式解释一下吗?我也许能更好地理解:) #导入@interface Car:NSObject @接口车:NSObject { 国际年; NSString*制造; NSString*模型; } **-(void)setMake:(NSString*)aMake和model:(NSString*)aModel和year:(int)aYear** -(作废)printCarInfo; -(int)年份; @结束 我想我

我正在努力学习obj-c,但有一点我不明白。我知道一些c#所以有人能试着用c#y的方式解释一下吗?我也许能更好地理解:)

#导入@interface Car:NSObject
@接口车:NSObject
{
国际年;
NSString*制造;
NSString*模型;
}
**-(void)setMake:(NSString*)aMake和model:(NSString*)aModel和year:(int)aYear**
-(作废)printCarInfo;
-(int)年份;
@结束

我想我理解变量的声明,但是我不理解metod(s?)。有人能解释一下它的作用吗(粗体代码)?

在Objective-C中,方法有命名参数。方法声明语法如下所示:

- (returnValue)nameOfArgument1:(typeOfArgument1)nameOfVariable1 
               nameOfArgument2:(typeOfArgument2)nameOfVariable2 
               nameOfArgument3:(typeOfArgument3)nameOfVariable3;
[myObject nameOfArgument1:variableToPass1 
          nameOfArgument2:variableToPass2
          nameOfArgument3:variableToPass3];
换行符当然是可选的,但是您需要至少用一个空格分隔参数。第一行的-符号表示这是一个实例方法(与类方法相反,类方法应该以+符号开头)

.m文件中的实现看起来完全相同,只是将分号替换为实现:

- (returnValue)nameOfArgument1:(typeOfArgument1)nameOfVariable1 
               nameOfArgument2:(typeOfArgument2)nameOfVariable2 
               nameOfArgument3:(typeOfArgument3)nameOfVariable3 {
    // Implementation
    // Return something of type "returnValue".
}
您可以从其他地方调用此方法,如下所示:

- (returnValue)nameOfArgument1:(typeOfArgument1)nameOfVariable1 
               nameOfArgument2:(typeOfArgument2)nameOfVariable2 
               nameOfArgument3:(typeOfArgument3)nameOfVariable3;
[myObject nameOfArgument1:variableToPass1 
          nameOfArgument2:variableToPass2
          nameOfArgument3:variableToPass3];

我希望这能让事情变得更清楚一点。

你学习中缺少的概念是“选择器”。这本质上就像用括号中的参数传递所不能得到的更多语义来“修饰”方法签名。我们倾向于使用描述性的、类似句子的“选择器”作为方法原型。作为一个例子,考虑这个基本函数:

void function setDimensions(int width, int height);
在Objective-C中,我们将这样写:

- (void) setWidth:(int) newWidth height:(int) newHeight;
“选择器”(selector)设置为:height:(包括冒号,但不包括任何其他内容)。这是唯一标识该类上的方法的东西

当您向该对象发送消息并在选择器中的冒号后面放置参数时,会在运行时调用该方法。因此,消息有三个基本组件:接收者、选择器和位置正确的参数:

[anObject setWidth: 1024 height: 768];
这里,
anObject
是接收者,
setWidth:height:
是选择器(帮助运行时找到方法),参数是:
newWidth=1024;新高度=768

然后,在该方法的实现中,只需像预期的那样使用newWidth和newHeight:

- (void) setWidth:(int) newWidth height:(int) newHeight; {
    self.width = newWidth; // 1024
    self.height = newHeight; // 768
}
一开始它可能看起来很笨拙,而且是多余的,但当你习惯了它之后,你会更喜欢它,并且发现自己在其他语言中写的函数名更长,语义更丰富


通过学习选择器的一些基本知识,可以更好地理解与选择器相关的概念,特别是“发送消息”(而不是“调用方法”)的概念,以及在运行时(而不是编译时)根据消息中使用的选择器查找实际方法的事实。这在运行时发生的事实为高度动态的体系结构提供了极大的灵活性

嗯,好的。因此,假设我想使用此方法发送消息(而不是调用:)。然后我会写:[实例名称42:22:]?但是我为什么/何时使用新宽度和新高度?不,对不起。。。我将添加一个关于发送消息(呼叫)的部分。您需要完整的选择器,每个冒号标识后面的参数。我还为“何时使用newWidth…”添加了实现代码,所以setWidth:height:是该方法唯一的(选择器)。像setDimensions()一样,在C#中是“唯一的”(选择器)?那么另一个问题是:如果生成另一个具有相同名称(setWith:height)的方法,会发生什么情况?编译器会告诉我它已经存在吗?(猜是吗?)还有,谢谢!你太棒了!:)在那门课上,是的。正如您所期望的,您可以在不同的类中重复使用相同的选择器。