Objective-C之Foundation Kit教程
文章目录
前言
这篇文章来帮助大家快速了解Cocoa的Foundation框架。
⚠️Foundation框架只是Cocoa的一部分,但是它并没有内置于Objective-C语言中
Cocoa Foundation框架中有很多有用的、面向数据的低级类和数据类型,例如NSString、NSArray、NSEnumerator和NSNumber等。
一、一些有用的数据类型
先来看看Cocoa中的一些结构体(struct)。
1.范围的作用
第一个结构体是NSRange:
typeder struct _NSRange {
ussigned int location;//location字段存放该范围的起始位置
ussigned int length;//length字段则是该范围内所含元素的个数
} NSRange;
这个结构体用来表示相关事物的范围,通常是字符串里的字符范围或者数组里的元素范围。
可以用3种方式创建新的NSRange:
- 直接给字段赋值:
NSRange range;
range.location = 17;
range.length = 4;
- 应用C语言的聚合结构赋值机制:
NSRange range = {
17,4 };
- 使用Cocoa提供的一个快捷函数NSMakeRange( ):
NSRange range = NSMakeRange(17,4);
使用NSMakeRange( )的好处是可以在任何能够使用函数的地方使用它,例如在方法调用中将其当成参数传递。
2.几何数据类型
NSPoint和NSSize可以用来处理几何图形的数据类型。
NSPoint代表的是笛卡尔平面中的一个点(x,y):
typeder struct _NSPoint {
float x;
float y;
} NSPoint;
NSSize用来存储宽度和长度:
typeder struct _NSSize {
float width;
float height;
} NSSize;
Cocoa还提供了一个矩形数据类型NSRect,它是由点和大小复合而成的:
typeder struct _NSRect {
NSPoint origin;//点
NSSize size;//大小
} NSRect;
Cocoa也提供了创建这些数据类型的快捷函数: NSMakePoint( )、NSMakeSize( )和NSMakeRect( )。
二、字符串
NSString是Cocoa中用来处理字符串的类,Cocoa中的NSString有很多内置方法,它们让字符串的处理变得简单很多。
字符串就是一组人类可读的字符序列。我们使用过的NSString型数据便是特殊的NSString字面量,其指示标志是字符串双引号前的@符号,例如@“Hello”。
1.创建字符串
我们见过的诸如printf( )和NSLog( )之类的函数,它们接收格式字符串和一些参数来输出格式化的结果。
NSString的 stringWithFormat: 方法就是通过 格式字符串 和 参数 来创建NSString的:
+ (id) stringWithFormat: (NSString *) format, ...;
可以按照以下方式创建一个新的字符串:
NSString *height;
height = [NSString stringWithFormat:
@"My height is %d feet, %d inches.",5,11];
//得到的字符串为"My height is 5 feet, 11 inches."
2.类方法
stringWithFormat: 的声明中有两个值得讨论的地方。
第一个是定义最后的省略号(…),它告诉我们这个方法可以接收多个以逗号隔开的其他参数,就像printf( )和NSLog( )一样。
第二个是声明的开始字符: 一个加号。OC运行时生成一个类的时候,它会创建一个代表该类的类对象。类对象包含了指向超类的指针、类名和指向类方法列表的指针。类对象还包含一个long型数据,为新建的类实例对象指定大小(以字节为单位)。
如果在声明方法时添加了加号(+),那么就是把这个方法定义为类方法。这个方法属于类对象,并且通常用于创建新的实例。我们称这种 用来创建新对象的类方法 为工厂方法。
stringWithFormat: 就是一个工厂方法,它根据我们提供的参数创建新对象。
类方法也可以用来访问全局数据,这里先不举例子了。
我们所创建的大部分方法都是实例方法,要用前导减号(-)来开始声明,这些方法将会在某个对象实例中运行,比如获取一个Circle的颜色或者一个Tire的气压等。
如果某方法用来实现常规功能,比如创建一个实例对象或者访问一些全局类数据,那么最好使用前导假号(+)将它声明为类方法。
3.关于大小
NSString中另一个方便的方法(实例方法)是 length ,它返回字符串中的字符个数。
声明如下:
- (unsigned int) length;
使用方法:
unsigned int lengthOfString = [height length];
//或
if([height length] > 35) {
NSLog(@"wow,you are really tall!");
}
NSString的length方法能够准确无误地处理国际字符串。
4.比较的策略
比较是字符串之间常见的操作,NSString提供了几个用于比较的方法。
- isEqualToString:
isEqualToString: 可以用来比较接收方和当作参数传递来的字符串。isEqualToString: 返回一个BOOL(YES/NO)型数据来表示两个字符串的内容是否相同。
它的声明及使用方法:
//声明
- (BOOL) isEqualToString: (NSString *) aString;
//使用方法
NSString *thing1 = @"hello 5";
NSString *thing2;
thing2 = [NSString stringWithFormat: @"hello %d",5];
if(thing1 isEqualToString: thing2) {
NSLog(@"They are the same!");
}
- compare:
compare: 将接受对象和传递来的字符串逐个字符地进行比较,它返回一个NSComparisonResult(一个enum型数据)来显示比较结果。
如果返回的结果是NSOrderedAscending,那么左侧的数值小于右侧的数值,即compare的目标在字母表中的排序位置比传递进来的字符串更靠前。例如,[@“aardvark” compare: @“zygote”]将会返回NSOrderedAscending。
同理,[@“zoinks” compare: @“jinkies”]将会返回NSOrderedDescending,并且[@“fnord” compare: @“fnord”]返回的是NSOrderedSame。
//3种结果
typedef enum _NSComparisonResult {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
} NSComparisonResult;
5.不区分大小写的比较
compare: 进行的是区分大小写的比较。还有一个方法 compare:options: ,它能给我们更多的控制权:
- <