一些有用的数据类型
范围
NSRange range1;range1.location = 10;range1.length = 20; NSRange range2 = {10, 20};NSRange range3 = NSMakeRange(10, 20);
几何数据类型
struct CGPoint { CGFloat x; CGFloat y;};struct CGSize { CGFloat width; CGFloat height;};struct CGRect { CGPoint origin; CGSize size;};CGPoint point = CGPointMake(0, 0);CGSize size = CGSizeMake(10, 10);CGRect rect = CGRectMake(0, 0, 10, 10);
这些数据类型都是C的结构体,所有的OC对象都是动态分配的,它会消耗大量的时间。
字符串
使用类方法创建字符串
NSString *str = [NSString stringWithFormat:@"My name is %@, I'm %d years old.", @"LiLei", 18];
关于大小
使用实例方法length,它返回字符串中字符的个数。
NSUInteger length = [str length];
字符串比较
使用下面的方法比较字符串是否相等。- (BOOL)isEqualToString:(NSString *)aString;
比较两个字符串可以用下面的方法
- (NSComparisonResult)compare:(NSString *)string;
NSComparisonResult是一个枚举类型。
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
字符串是否包含别的字符创
判断字符串的前缀和后缀。
- (BOOL)hasPrefix:(NSString *)str;- (BOOL)hasSuffix:(NSString *)str;
判断字符串内是否包含其他字符串。
- (NSRange)rangeOfString:(NSString *)searchString;
集合家族
NSArray
OC数组有两个限制,它只能存储OC的对象,同时不能再数组中存储nil。
下面通过代码来学习遍历数组的方法:
NSArray *arr = @[@"one", @"two", @"three"];//1.枚举NSEnumerator *enumerator = [arr objectEnumerator];id obj;while (obj = [enumerator nextObject]) { NSLog(@"%@", obj);}//2.快速枚举for (id obj in arr){ NSLog(@"%@", obj);}//3.使用代码块[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL* stop) { NSLog(@"%@", obj);}];
字典
NSDictionary *dic = @{@"name" : @"LiLei", @"age" : @18};NSMutableDictionary *dics = [NSMutableDictionary dictionaryWithDictionary:dic];[dics setValue:@"123" forKey:@"phone"];NSLog(@"%@", dics);
不要尝试创建,字符串,数组和字典的子类,它们实际上是以类簇的方式实现的。
NSNumber 类
上面提到了OC数组中只能存储OC的对象,不能存储基本类型的数据,OC提供了NSNumber类来封装基本数据类型。
通常将一个基本类型的数据封装成对象的过程被称为装箱,反之则称为开箱。OC并不支持自动装箱功能。
NSValue 类
NSValue是NSNumber的父类,它可以封装任意值,可以用它将结构体放入数组或者字典中。
NSRect rect = NSMakeRect(0, 0, 120, 120);NSValue *value = [NSValue valueWithRect:rect];NSArray *array = @[value];NSRect rect2 = [value rectValue];
NSNull
前面提到OC数组中不能存放nil,但有时候确实需要存储一个“什么都没有”的值,这时候可以使用NSNull。
它是一个十分简单的类,只有一个方法:+ (NSNull *)null;
[NSNull null]总是返回一样的数值,所以可以使用“==”将该值与其他值进行比较。
示例程序:查找文件
NSFileManager *manager = [NSFileManager defaultManager];NSString *home = [@"~" stringByExpandingTildeInPath];NSMutableArray *files = [NSMutableArray arrayWithCapacity:100];for(NSString *filaname in [manager enumeratorAtPath:home]){ if([[filaname pathExtension] isEqualToString:@"png"]){ [files addObject:filaname]; }}for (NSString *filename in files){ NSLog(@"%@", filename);}
结果如下:
2018-04-22 21:30:29.089471+0800 test[8798:1458539] Desktop/屏幕快照 2018-04-21 下午3.10.56.png2018-04-22 21:30:29.089479+0800 test[8798:1458539] Desktop/屏幕快照 2018-04-21 下午3.14.54.png2018-04-22 21:30:29.089489+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午12.07.45.png2018-04-22 21:30:29.089497+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午12.08.05.png2018-04-22 21:30:29.089505+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午1.54.33.png2018-04-22 21:30:29.089512+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午12.08.31.png