4.3 方法(任务)
本节,我们就来讨论如何在类中定义和使用方法(method)。再次说明,在Apple官方文档中,方法称为任务(Task)。
■4.3.1 创建方法
前面,我们已经了解到,在类中的方法可以分为实例方法和类方法,在这里,我们将主要讨论实例方法,而类方法除了在定义时使用+符号,其他的要素都与实例方法相同。
接下来,我们会根据参数的数量,分为三种情况来讨论方法的定义,包括:
❑ 没有参数的方法。
❑ 有一个参数的方法。
❑ 有两个或更多参数的方法。
为什么要这样玩呢?我想这一定是某些人的情怀造成的(肯定不是我的),我只是想,这样介绍也许更能帮助大家理解。
在讨论方法的参数之前,我们需要了解,方法都是要设置返回值类型的,与函数不同的是,方法的返回值类型需要使用一对圆括号,如下面的代码。
-(int) getId;
如果返回值类型是一个对象类型,不要忘记使用*符号(因为对象是指针了),如下面的代码。
-(NSString*) getName;
如果方法没有返回值,则使用void关键字来指定。
-(void) move;
接下来,我们就讨论参数的三种情况。
1.没有参数的方法
前面示例中,我们创建的就是没有参数的方法,格式很简单,如下面的代码(以实例方法为例)。
-(<返回值类型>) <方法名>;
如下面的代码,我们就会在CRobot类中再定义一个没有参数的work方法,首先在接口部分声明它。
@interface CRobot : NSObject -(void) work; // 其他代码 @end
然后,在实现部分定义work方法,如下面的代码。
@implementation CRobot -(void) work { NSLog(@"机器人工作中"); } // 其他代码 @end
我们使用如下代码调用这个方法。
CRobot *robot5 = [[CRobot alloc] init]; [robot5 work];
2.有一个参数的方法
当方法有一个参数时,我们使用如下格式定义(以实例方法为例)。
-(<返回值类型>) <方法名> : (<参数类型>)<参数变量>;
我们还是先在接口部分声明方法,如下面的代码。
@interface CRobot : NSObject -(void) work : (NSString*) name; // 其他代码 @end
然后,在实现部分定义这个方法。
@implementation CRobot -(void) work : (NSString*) name { NSLog(@"机器人 %@ 正在工作", name); } // 其他代码 @end
我们使用如下代码调用这个方法。
CRobot *robot5 = [[CRobot alloc] init]; [robot5 work : @"No.5"];
也许你也发现了,我们定义的两个方法都是work,这不会有冲突吗?不会的,它们的参数数量是不一样的,调用时会自动匹配,并找到需要执行的那一个方法。
3.有两个或更多参数的方法
当方法中有两个或更多参数时,参数之间使用空格符分隔,并且,从第二个参数开始使用下面的格式定义。
<参数名称>:(<参数类型>) <参数变量>
如下面的moveToX:Y:方法,我们定义了两个参数,首先还是在接口部分声明。
@interface CRobot : NSObject -(void) moveToX:(float)mx Y:(float) my; @end
接着,我们在类的实现部分定义这个方法。
@implementation CRobot -(void) moveToX:(float)mx Y:(float) my { NSLog(@"移动坐标到(%f, %f)", mx, my); } @end
我们使用如下代码来调用这个方法。
CRobot *robot5 = [[CRobot alloc] init]; [robot5 moveToX:10.0 Y:15.0];
实际上,我们可以看到,这种定义参数的形式会让方法使用起来更像是一句自然语言,比如,这个moveToX方法的调用,包含参数的意思就是“移动到X坐标10.0和Y坐标15.0”。不过,这里的自然语言显然指的是英文。
当然,如果不想在方法中使用绕口的英文,也可以不使用<参数名称>,如下面的代码。
// 接口部分 @interface CRobot : NSObject -(void) moveTo:(float)mx :(float)my; @end // 实现部分 @implementation CRobot -(void) moveTo:(float)mx :(float)my { NSLog(@"移动坐标到(%f, %f)", mx, my); } @end
如果不使用<参数名称>,则每个参数使用冒号(:)开始,然后包括<参数类型>和<参数变量>即可。我们可以使用如下代码来调用这个方法。
CRobot *robot5 = [[CRobot alloc] init]; [robot5 moveTo:100 :200];
■4.3.2 description方法与NSLog()函数
在Objective-C定义的类中,还可以使用一些特殊成员,description方法就是其中之一,它的功能就是返回对象的描述。
descrition方法定义在NSObject类中,下面的代码,我们将在CRobot类的实现代码中重写这个方法。
@implementation CRobot -(NSString*) description { return @"这是机器人对象"; } @end
然后,我们可以在NSLog()函数中使用%@格式化字符来显示对象信息,如下面的代码。
CRobot *robot5 = [[CRobot alloc] init]; NSLog(@"%@", robot5);
前面的内容中,我们已经看到NSLog()函数中使用的一些格式化字符,如基本数据类型的格式化字符,而%@格式化字符用于显示对象信息,这些对象信息就可以通过重写类的description方法定义。