——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
Foundation是一种基础框架,框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios
框架的基础。
如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了,
即:#import<Foundation/Foundation.h>
结构体
在Foundation中常用4种结构体
1> 表示范围——NSRange(location length) ,其中location表示位置,length表示长度。
1)表示字符串的范围
NSRange r1 = {6,2}; // 可读性差
NSRange r2 = {.location = 6, .length = 2}; // 太乱,不用
NSRange r3 = NSMakeRange(6,2); // 掌握
2)查找字符串中某个字符的范围
NSString *str = @"today is monday";
NSRange range = [str rangeOfString:@"is"];
NSLog(@"location = %ld,range = %ld”,range.location,range.length);
注:数据类型为ld;
2> 表示坐标——NSPoint/CGPoint
CGPoint p1 = NSMakePoint(6, 9);
NSPoint p2 = CGPointMake(6, 9); // 常用
注:坐标以左上角为原点,向右为x轴正方向,向下为轴正方向。
3> 表示尺寸——NSSize/CGSize
NSSize s1 = CGSizeMake(100, 50);
NSSize s2 = NSMakeSize(100, 50);
CGSize s3 = NSMakeSize(200, 60);
4> 表示一个UI元素的尺寸和位置——NSRect/CGRect(CGPoint CGSize)
创建结构体变量的方式
CGRect r1 = CGRectMake(0, 0, 100, 50);
CGRect r2 = { {0, 0}, {100, 90}};
CGRect r3 = {p1, s2};
CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
注:使用CGPointZero等的前提是添加CoreGraphics框架,导入框架:Build phase->link (+)
CGPointZero == CGPointMake(0, 0);
同理还有CGSizeZero\CGRectZero
在开发中,若想要验证结构体中属性的值,可以利用框架函数把相应的结构体转变成字符串,再直接打印字符串。
例:
NSString *str1 = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s3);
NSString *str3 = NSStringFromRect(r1);
NSLog(@"%@", str1);
5> Foundation框架中一些经常用到的结构体函数
1)比较两个点是否相同——CGPointEqualToPoint
BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
同理:
CGSizeEqualToSize(<#CGSize size1#>, <#CGSize size2#>)
CGRectEqualToRect(<#CGRect rect1#>, <#CGRect rect2#>)
2)判断Point是否在Rect范围内—— CGRectContainsPoint
BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50),
CGPointMake(60, 45));
NSLog(@"%d", b2); // b2 = 1;
字符串
NSString和NSMutableString的用法及注意:
NSString—不可变字符串;
NSMutableString—可变字符串;
字符串的创建方式
// 方式1
NSString *str1 = @"hello";
// 方式2,不提倡
NSString *str2 = [[NSString alloc] initWithString:@"hello"];
// 方式3
NSString *str3 = [[NSString alloc]initWithFormat:@"age is %d",20];
// 方式4,C字符串——>OC字符串
NSString *str4 = [[NSString alloc] inWithUNTF8String:"hello"];
// OC字符串——>c字符串
const char *c = [str4 UNTF8String];
// 方式5
NSString *str5 = [[NSString alloc] initWithContentsOfFile:
@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];
// 方式6
NSURL *url = [[NSURL alloc] initWithString:
@"file:///Users/apple/Desktop/1.txt"];
NSURL *url1 = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
NSString *str6 = [[NSString alloc] initWithContentsOfURL:
url1 encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str6 = %@",str6);
字符串的导入和导出
字符串的导出
// 把字符串写入到文件中,文件不存在则创建
[@"Jack\nJack" writeToFile:@"/Users/apple/Desktop/my.txt" automically :
YES encoding:NSUTF8StringEncoding error:nil];
// 把字符串写入到源位置
NSString *str = @"Jack";
NSURL *url = [NSURL fileURLWithPath:@"file:///Users/apple/Desktop/1.txt"] ;
[str writeToURL:url automically:YES encoding:
NSUTF8StringEncoding error:nil];
// 这里的automically后面一般是YES, 若中途写入失败则不再创建,更安全
3)类方法
// 一般都会有一个类方法与对象方法相对应,类方法通常以类名开头
[NSString stringWithFormat:@""];
[NSURL URLWithString:(NSString *)];
[NSString stringWithContentsOfFile:(NSString *) encoding :
(NSStringEncoding) error:(NSError *__autoreleasing *)];
4)NSMutableString的使用注意
// 拼接
NSMutableString *s1 = [NSMutableString stringWithFormat:"age is %d",10];
// 拼接到s1后面
[s1 appendingString:@" 11 12"];
// 删除
NSRange range = [s1 rangeOfString:@"is"]; // 获取范围
[s1 deleteCharactersInRange:range]; // 删除
// 不可变字符串
NSString *s2 = [NSString sstringWithFormat:@"age is 6"];
NSString *s3 = [s2 stringByAppendingString:@" 7 8"];
// 此方法是把s2内容拷贝一份,再拼接上后边的字符串组成新字符串返回s3,s2本身不变
NSLog(@"s1=%@, s2=%@, s3=%@",s1,s2,s3);
运行结果:
NSString[1036:154815] s1=my age 10 11 12,
s2=age is 6, s3=age is 6 7 8
集合
NSArray和NSMutableArray
NSArray不可变数组
1、NSArray的基本介绍
NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组;
C语言数组有一个缺点即数组中只能存放同种数据类型的元素;
OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等。
2、NSArray的创建
NSArray *array1 = [NSArray arrayWithObject:@"jack"];
// object代表任何对象,但只能放一个
NSArray *array2 = [NSArray arrayWithObjects:@"jack", @"rose", nil];
// objects代表多个对象,且nil不可少,是数组元素结束的标记
NSArray *array3 = @[@"jack", @"rose", @"4324324"];
// 快速创建一个NSArray对象
3、NSArray的元素个数
[array1 count]; // 等价于array.count
NSLog(@"%ld", array1.count);// 数据类型ld
3、NSArray的访问
NSLog(@"%@", [array3 objectAtIndex:1]);
// 结果rose,旧方法,不提倡
NSLog(@"%@", array3[0]);
// 简洁,提倡
4、NSArray的遍历
首先创建一个数组
NSArray *array = @[@"jack",@"rose",@"dave"];
第一种方法:使用for循环遍历
// 方法1
for (int i = 0; i<array.count; i++)
{
NSLog(@"%@", array[i]);
}
// 方法2
for(id obj in array)
{
NSLog(@"%@",obj);
}
// id obj代表着数组中的每一个元素
// 方法3
int i = 0;
for (id obj in array)
{
NSLog(@"%ld - %@", i, obj);
i++;
}
// 方法4
for (id obj in array)
{
// 找出obj元素在数组中的位置
NSUInteger i = [array indexOfObject:obj];
//obj在数组array中的位置,返回值类型NSUInteger
NSLog(@"%ld - %@", i, obj);
i++;
if (i==1)//停止遍历
{
break;
}
}
// 方法5
// 每遍历到一个元素,就会调用一次block(代码段)
// 并且当前元素和索引位置当做参数传给block
[array enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
};
// 注意1:break只使用在两种场合,即switch和循环结构中。
// 注意2:stop参数用来停止遍历,其值若为YES,则停止。
NSMutableArray可变数组
NSMutableArray的基本使用
注意:
1> NSMutableArray继承自NSArray,几乎拥有NSArray的一切方法
2> 创建NSMutableArray不可以使用@[ ] ,@[ ]只创建不可变数组NSArray
// 错误写法
NSMutableArray *array = @[@"jack", @"rose"];
// @[ ]只创建不可变数组NSArray
NSArray *array = @[@"jack", @"rose"];
基本使用:
// 创建可变数组
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
// 添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];
// 删除元素
[array removeAllObjects];
// 删除指定的对象
[array removeObject:@"jack"];
[array removeObjectAtIndex:0];
// 不能添加空,错误写法
// [array addObject:nil];
// 计算元素个数
NSLog(@"%ld", array.count);
}
NSSet和NSMutableSet
NSSet不可变集合
基本使用:
NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
// 随机拿出一个元素
NSString *str = [s2 anyObject];
NSLog(@"%@", str);
NSMutableSet可变集合
基本使用:
NSMutableSet *s = [NSMutableSet set];
// 添加元素
[s addObject:@"hack"];
// 删除元素
// [s removeObject:<#(id)#>];
NSSet和NSArray的对比
1、共同点:
1> 都是集合,都能够存放多个对象
2> 只能存放oc对象,不能存放非oc对象类型(如int等基本数据类型和结构体,枚举等)
3> 本身都不可变,都有一个可变的子类
2、不同点:
NSArray有顺序,NSSet没有顺序
NSDictionary和NSMutableDictionary
NSDictionary不可变字典
1、介绍
OC中的NSDictionary:根据key找到value,里面存储的东西都是键值对
字典不允许有相同的key,但允许有相同的value(Object)
字典是无序的
2、NSDictionary的创建
// 方法1
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
// 方法2
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
// 方法3
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"jack", @"name",
@"北京", @"address",
@"32423434", @"qq", nil];
// 方法4
NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};
注意:快速创建字典是编译器特性。
3、NSDictionary的访问
id obj = dict[@"name"];
NSLog(@"%@", obj);
// 返回的是键值对的个数
NSLog(@"%ld", dict.count);
NSArray *persons = @[
@{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]},
@{@"name" : @"rose", @"qq" : @"767567"},
@{@"name" : @"jim", @"qq" : @"423423"},
@{@"name" : @"jake", @"qq" : @"123123213"}
];
NSString *bookName = persons[0][@"books"][1];
NSLog(@"%@", bookName);
// 先取出1位置对应的字典
// 再取出字典中qq这个key对应的数据
NSLog(@"%@", persons[1][@"qq"]);
运行结果:
2015-04-28 23:23:24.018 06-NSDictionary[1689:114110] 5分钟突破android编程
2015-04-28 23:23:24.019 06-NSDictionary[1689:114110] 767567
4、NSDictionary的遍历
NSDictionary *dict = @{
@"address" : @"北京",
@"name" : @"jack",
@"name2" : @"jack",
@"name3" : @"jack",
@"qq" : @"7657567765"};
[dict enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {
NSLog(@"%@ - %@", key, obj);
// *stop = YES;
}];
NSMutableDictionary可变字典
1、NSMutableDictionary的基本使用
NSMutableDictionary *dict = @{@"name" : @"jack"};
[dict setObject:@"rose" forKey:@"name"];
NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];
// 添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
[dict setObject:@"rose" forKey:@"name"];
// 移除键值对
[dict removeObjectForKey:<#(id)#>];
2、NSMutableDictionary的使用注意
注意:@{key1 : value1, key2 : value2}这种快速创建的方式只适用于不可变字典。