本人已经系统地学习过C语言,因此这里仅归纳出OC与C语言中有关数据类型不一样的点。
数据类型
- NSLog中,int使用
%i
来占位,float使用%f
来占位,double一般使用%g
来占位。 - 与C语言一样,对于有限定词修饰的数据类型,如果有long修饰,则占位符也需要添加
l
;如果有unsigned修饰,则占位符需要添加u
。 - BOOL,OC的布尔类型与C不同,ta使用
YES
和NO
来表示。 - 字符串对象(NSString),ta是一个OC对象,属于对象数据类型,要用@号修饰,如:
NSString* str = @"abcdef"
,字符串对象要使用%@
占位。
以下为基本数据类型的NSLog占位符
类型 | 占位符 |
---|---|
char | %c |
short int | %hi、%hx(十六进制)、%ho(八进制) |
unsigned short int | %hu |
int | %i、%x、%o |
unsigned int | %u |
long int | %li、%lx、%lo |
unsigned long int | %lu |
long long int | %lli、%llx、%llo |
float | %f、%e、%g |
double | %f、%e、%g |
long double | %Lf、%Le、%Lg |
id | %p |
对象类型
对象类型值的就是类了,在OC中,class类型变量必须使用指针,表示方式为:
NSString* str;
NSLog中,对象型变量使用%@
来占位,不过需要注意的是,要想使用%@
占位,在控制台上打印出结果,在类的implementation中需要重写NSObject类description属性的get方法,否则只会显示该对象的地址,如:
#import <Foundation/Foundation.h> //OC的基础库
#import "ResetNSObject.h"
int main(int agrc, const char* agrv[]) {
@autoreleasepool {
ResetNSObject* str = [[ResetNSObject alloc] init];
NSLog(@"str = %@", str);
}
return 0;
}
运行结果如下:
以下为重写最终父类NSObject:
@implementation Fraction
- (NSString *) description {
return [NSString stringWithFormat: @"resetNSObjet"];
}
@end
再来看看重写父类后的运行结果:
id类型
id类型也是表示class的数据类型,当你不知道某个class的具体类名是什么时,就可以使用id来声明class类型的变量,需要注意的是,id默认就是指针,无需使用*
声明变量,如:
id graphicObject;
这也是OC不同与C的地方,id是OC实现多态和动态类型、动态绑定的基础。
Calculator类实例分析
根据前面所学,创建一个Caculator类,也可称计算机类,这个类包含加、减、乘、除四则运算。
先声明一个Caculator类,这个类的用法是可以不停地进行运算,所以ta会有一个累计结果,除了加、减、乘、除四个方法外,还有一个clear方法清除之前的运算结果。
声明如下:
#import <Foundation/Foundation.h>
@interface Caculator : NSObject
/// 结果
@property double accumulator;
/// 清除
- (void) clear;
/// 加法
/// - Parameter value: val
- (void) add: (double) value;
/// 减法
/// - Parameter value: val
- (void) subtract: (double) value;
/// 乘法
/// - Parameter value: val
- (void) multiply: (double) value;
/// 除法
/// - Parameter value: val
- (void) divide: (double) value;
@end
实现如下:
#import "Caculator.h"
@implementation Caculator
@synthesize accumulator;
- (void) clear {
accumulator = 0;
}
- (void) add: (double) value {
accumulator += value;
}
- (void) subtract: (double) value {
accumulator -= value;
}
- (void) multiply: (double) value {
accumulator *= value;
}
- (void) divide: (double) value {
accumulator /= value;
}
@end
现在来测试一下:
#import <Foundation/Foundation.h> //OC的基础库
#import "Caculator.h"
int main(int agrc, const char* agrv[]) {
@autoreleasepool {
Caculator* cal = [[Caculator alloc] init];
cal.accumulator = 0;
[cal add: 200.];
[cal divide: 15.5];
[cal subtract: 10.3];
[cal multiply: 5];
NSLog(@"the result is %g", cal.accumulator);
[cal clear];
[cal add: 5.];
NSLog(@"the result is %g", cal.accumulator);
}
return 0;
}
运行结果如下: