一些有用的数据类型
范围
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.png
2018-04-22 21:30:29.089479+0800 test[8798:1458539] Desktop/屏幕快照 2018-04-21 下午3.14.54.png
2018-04-22 21:30:29.089489+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午12.07.45.png
2018-04-22 21:30:29.089497+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午12.08.05.png
2018-04-22 21:30:29.089505+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午1.54.33.png
2018-04-22 21:30:29.089512+0800 test[8798:1458539] Desktop/pic/屏幕快照 2018-04-21 下午12.08.31.png