大家好!小糖我又来了。这次呢,我们来讲讲oc中点语法的使用。
什么是点语法呢?学过java等其他面向对象的语言的人应该知道,在其他面向对象的语言中,点语法一般是用来调用某个方法的。但是oc中的点语法和其他语言中的点语法是不一样的,oc中的点语法只能调用设置器与访问器方法,也就是之前讲过的setter、getter方法,无法调用其它方法,这点需要注意一下,可能有些学过其他语言的人可能会一不小心就在调用其他方法的时候直接就用点语法了,要着重注意,这样的用法是错误的。切记oc中的点语法只能调用设置器和访问器的方法。
我们之前讲过设置器和访问器方法,拿之前定义过的Person类来讲吧,比如说我们要设置Person类中的_name属性,我们需要这样调用方法:
[person setName:@"张三"];
这是一个简单的设置器方法,如果我们用点语法来调用设置器的方法,该怎么调用呢?我们看下面:
person . name = @"张三";
上面两个其实是等价的。用点语法的条件是你得有设置器方法,否则你是无法调用的。如果我们要获得_name的值,我们需要调用访问器方法:
NSString * name = [person getName];
那么,我们用点语法该怎么调用呢?就像下面这样:
NSString * name = person . name;
这样我们就成功的使用点语法调用了设置器与访问器方法。在这里再强调一次,要使用点语法,我们需要保证有设置器和访问器方法,如果没有,就无法调用,而且无法调用其它方法,这点需要切记。
假如我们调用了其他方法,我们来看看结果会是怎样的。比如说在Person类中有一个run方法,那么我们在main中进行如下操作:
persong . run = @"张三';
你觉得会有什么样的结果呢?这时候编译器就会在此处报错,大概意思就是没有此设置器方法 ‘setRun’。为啥会报这种错误呢?我们来看看,如果你像上面那样调用run方法的话,那么它其实等价于:
[person setRun:@"张三"];
这个就相当于调用了setRun方法,而其实在Person类里面没有setRun这个方法,我们的目的是想通过点语法调用run这个方法,而在oc中点语法默认是调用setter、getter方法,是根本无法调用其它方法的。
同样的,我们来试试另一种情况。比如我们这么调:
NSString * s = person . run;
这样调可以吗?如果你的run方法是这么定义的话:
- (void) run;
上面那种调用方法等效于:
[person run];
那么上面那种调用方法是不行的,为什么呢?像上面那种调用方式说明run方法得有返回值,但是run方法没有返回值,所以不行。那么,如果我们把run改成有返回值的话,结果会事怎样的呢?比如我们改成下面这样:
- (NSString *) run;
在实现run方法中给它return一个字符串,这时候再用 NSString * s = person . run;调用可以吗?这个时候很神奇的事发生了,运行正确,没有报错。这是为什么呢?有人肯定会质疑小糖:你不是说点语法只能调用setter、getter方法吗?怎么这样也可以调用呢?别急,小糖来说明一下。其实说白了,什么是get方法,get方法就是有返回值的方法,我们给run设置了返回值,则便把run看成是一个getter方法,即使它没有获得类中属性的值,但它可以看成是一个getter方法,既然是getter方法,那我们就可以用点语法访问,所以,这里其实是不矛盾的。
其实,只要方法中有参数传入的话,也可以看成set方法,也可以使用点语法调用,过程差不多,在这里就不多说了。
这里补充一下,从oc2.0版本开始,有自动合成setter、getter方法,有时候我们的某个类里面如果有很多成员变量的话,为每一个都写setter和getter方法是非常无聊的事,现在的话,oc提供了两个关键字@property和@synthesize,用来自动合成setter和getter方法。自动合成方法步骤如下:
1.在类声明部分使用@property指令定义属性,定义时候不需要将其放在花括号内,只要放在@interface和@end之间就好,比如我们要在Person类里面定义两个属性,我们可以像下面这样:
@interface Person : NSObject
//使用@property定义两个属性
@property NSString * name;
@property int age;
@end
2.在类实现部分使用@synthesize指令声明该属性即可。
@implementation Person
@synthesize name;
@synthesize age;
@end
这样就可以自动合成setter和getter方法了。是不是感觉比一个个定义简单呢。
好了,这次就讲到这里了。我们下次博文再见了。