--------------------------------------
android培训
、
java培训
、ios培训期待与您交流! ---------------------------------
Foundation框架是其他所有ios框架的基础,Foundation框架包含了很多开发中常用的数据类型:结构体、枚举、类。Foundation框架是乔布斯在NextStep公司的时候开发的。所以,基于Foundation框架的数据类型大部分都以NS开头如:NSString,NSLog等等。
1,Foundation框架中常用的结构体
<1>NSRange:表示一个范围,在UI开发中经常用到。
void Range()
{
/*NSRange:表示一个范围,内部结构是结构体:意思就是从location起有多少length的范围。
typedef struct _NSRange {
NSUInteger location;代表位置
NSUInteger length; 代表长度
} NSRange;
*/
//定义一个范围
// NSRange r1 = {2,4};//不用
// NSRange r2 = {.location = 2, .length = 4};//不用
// NSRange r3 = NSMakeRange(5, 6); //常用必须掌握
//定义一个OC字符串str
NSString *str = @"I love china";
//查找love在字符串str中的范围,如果找不到,length=0,location=NSNotFound==-1
NSRange r4 = [str rangeOfString:@"love"];
//这里用%ld是因为location、length的返回值是NSUInteger,其实内部是unsigned long。
NSLog(@"location = %ld,length = %ld",r4.location,r4.length);
//运行结果:2014-04-13 13:54:49.050 Foundation框架-结构体[433:303] location = 2,length = 4
}
<2>Foundation中对坐标点、UI尺寸、矩形块的使用
void point()
{ /*NSPoint或者CGPoint:代表一个坐标点
NSSize或者CGSize:代表一个UI元素的尺寸(包含宽width和高width)
NSRect或者CGRect:代表一个矩形块(由点和尺寸组成)
*/
//定义一个点的方式:
CGPoint p1 = NSMakePoint(10, 20);
CGPoint p2 = CGPointMake(10, 20);
NSPoint p3 = CGPointMake(20, 30);//开发中最常用的
NSPoint p4 = NSMakePoint(20, 30);
//表示原点,
//CGPointZero 相当于 CGPointMake(0, 0);
//定义一个UI元素尺寸的方式
NSSize s1 = NSMakeSize(100, 50);
CGSize s2 = CGSizeMake(100, 50);
NSSize s3 = CGSizeMake(150, 50);
CGSize s4 = NSMakeSize(150, 50);
//定义一个矩形块的方式(由点和尺寸组成)
NSRect r1 = NSMakeRect(10, 20, 100, 50);
CGRect r2 = CGRectMake(0, 0, 100, 50);
CGRect r3 = {{10,20},{100,50}};
CGRect r4 = {p1,s1};
//定义一个范围
NSRange rang = NSMakeRange(2, 3);
//将结构体转为字符串
NSString *str1 = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s1);
NSString *str3 = NSStringFromRect(r1);
NSString *str4 = NSStringFromRange(rang);
NSLog(@"%@<-->%@<-->%@<-->%@",str1,str2,str3,str4);
//运行结果是:
//2014-04-13 15:06:36.950 Foundation框架-结构体[519:303] {10, 20}<-->{100, 50}<-->{{10, 20}, {100, 50}}<-->{2, 3}
//比较两个点是否相同
BOOL b1 = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
//比较两个矩形块是否相同
//CGRectEqualToRect(<#CGRect rect1#>, <#CGRect rect2#>);
//比较两个UI元素的尺寸是否相同
//CGSizeEqualToSize(<#CGSize size1#>, <#CGSize size2#>);
// 判断一个点是否在一个矩形块内
BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(60, 45));//
NSLog(@"%d---%d",b1,b2);//运行结果:2014-04-13 15:20:24.416 Foundation框架-结构体[588:303] 1---1
//使用CGPointZero、CGRectEqualToRect、CGRectContainsPoint等的前提是要添加CoreGraphics框架
}
2,Foundation框架中常用的类
<1>字符串(NSString)
(1)NSString:不可变字符串
/*
//1,字符串的创建
NSString *str1 = @"I like itheima";
//NSString *str2 = [[NSString alloc] initWithString:@"itheima"];不用的
NSString *str3 = [[NSString alloc] initWithFormat:@"age is %d",20];//字符串拼接返回新的字符串
//C字符串转换成OC字符串
NSString *str4 = [[NSString alloc] initWithUTF8String:"itheima"];
//OC字符串转换成C语言字符串
const char *c = [@"beijing" UTF8String];
const char *c1 = [str1 UTF8String];
// NSLog(@"%@",str4);
//printf("%s %s\n",c,c1);
//2,从文件读取字符串
//NSUTF8StringEncoding 用到中文就要用这种编码
NSString *str5 = [[NSString alloc] initWithContentsOfFile:@"/Users/wzh/Desktop/123.txt" encoding:NSUTF8StringEncoding error:nil];
//3,从URL读取字符串
//URL:资源路径
//协议头:路径
NSURL *url = [[NSURL alloc] initWithString:@"http://www.itheima.com"];
*/
//NSURL *url1 = [[NSURL alloc] initWithString:@"file:///Users/wzh/Desktop/123.txt"];
NSURL *url1 = [NSURL fileURLWithPath:@"/Users/wzh/Desktop/123.txt"];
NSString *str6 = [[NSString alloc] initWithContentsOfURL: url1 encoding:NSUTF8StringEncoding error:nil];
NSLog(@"\n%@",str6);
//一般都会有一个类方法跟对象方法对应,开发中一般都使用类方法,效率比较高
// [NSURL URLWithString:@"http://www.itheima.com"];
// [NSString stringWithContentsOfFile:url encoding:NSUTF8StringEncoding error:nil];
// [NSString stringWithFormat:@"age is %d",25];
//4,字符串的导出(把字符串写进文件中)
[str6 writeToFile:@"/Users/wzh/Desktop/My.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
[@"I \nlike \nitheima" writeToFile:@"/Users/wzh/Desktop/My.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSURL *url2 = [NSURL fileURLWithPath:@"/Users/wzh/Desktop/abc.txt"];
[@"I \nlike \nitheima" writeToURL:url2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
(2)NSMutableString:可变字符串
//创建可变字符串
NSMutableString *s1 = [NSMutableString stringWithFormat:@"i like china"];
NSMutableString *s2 = [NSMutableString stringWithString:@" itheima"];
//拼接s2到s1的后面
[s1 appendString:s2];
//获取like在s1中的范围,并且删除like
NSRange ragne = [s1 rangeOfString:@"like"];
[s1 deleteCharactersInRange:ragne];
//创建不可变字符串
NSString *s3 = [NSString stringWithFormat:@"name is %@",@"jim"];
//拼接内容到s3的后面并且返回一个新的字符串s4
NSString *s4 = [s3 stringByAppendingString:@"123"];
NSLog(@"%@\n%@\n%@\n%@",s1,s2,s3,s4);
(3)NSString和NSMutableString的区别:
1,创建方式都差不多的;
2,在拼接字符串的时候,NSString返回的时一个新的字符串,而NSMutableString返回的是原来的字符串加拼接上的字符串。
3,两者的删除子串的方式不一样:NSMutableString是先获取要删除子串在母串中的范围,再根据范围去删除对应的子串,并且返回删除子串后的母串。NSString删除字符串的方式是先把不可变的字符串转换成可变字符串,然后再利用可变字符串的删除方式删除子串。
//不可变字符串删除子串的方法:将NSString转换成NSMutableString,然后再删除子串。
//定义不可变字符串
NSString *s = @"I like beijing";
//将不可变字符串转换成可变字符串
NSMutableString *s2 = [NSMutableString stringWithString:s];
//找到like在s2中的范围,并且删除like
NSRange r = [s2 rangeOfString:@"like"];
[s2 deleteCharactersInRange:r];
NSLog(@"%@",s2);//结果为:I beijing
3,Foundation框架中常用的集合类
<1>Array:
NSArray:不可变数组
void array()
{
//OC数组不能存放nil值
//OC数组只能存放OC对象,不能存放非OC对象类型,比如int、struct、enum等
NSArray *arr1 = [NSArray array];//这个数组arr1永远是空数组
//1,OC数组的创建
NSArray *arr2 = [NSArray arrayWithObject:@"jim"];//只能存放一个元素
//可以存放多个元素,nil是数组元素结束的标志
NSArray *arr3 = [NSArray arrayWithObjects:@"jack",@"rose",@"jake",@"jiesn", nil];
//快速创建数组(编译器的新特性)
NSArray *arr4 = @[@"jack",@"rose"];//这个比较常用
//2,获取NSArray的元素个数
NSLog(@"%ld---%ld",arr2.count,arr3.count);
//3,访问OC数组中的元素
NSLog(@"%@",[arr3 objectAtIndex:1]);
//编译器的新特性
NSLog(@"%@", arr3[1]);//这个比较常用
//4,数组元素的遍历
Person *p = [[Person alloc] init];//创建Person对象
NSArray *arr5 = @[p,@"beijing",@"shanghai",@"taiwan"];//创建数组
//一般遍历
for (int i = 0; i < arr5.count; i++) {
NSLog(@"%@",arr5[i]);
}
//快速遍历: id obj:代表着数组中的每一个元素
for (id obj in arr5)//缺点是不知道遍历的是第几次,但是可以通过定义变量实现
{
//找出obj元素在数组中的位置
NSUInteger i = [arr5 indexOfObject:obj];
NSLog(@"%ld - %@",i,obj);
}
//利用block遍历数组元素:每遍历到一个元素,就会调用一次Block,并且把当前元素和元素的索引位置当做参数传给block
[arr5 enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@",idx,obj);
}];
}
NSMutableArray:可变数组
void MutableArray()
{
//1,创建可变数组
NSMutableArray *marr = [NSMutableArray arrayWithObjects:@"shanghai",@"taiwan",nil];
//NSMutableArray *arr = @[@"beijing",@"shanghai"];错误写法 @[]只能创建不可变数组NSArray
//2,添加元素
[marr addObject:[[Person alloc] init]];
[marr addObject:@"beijing"];
//[marr addObject:nil];这个是错误写法
//3,删除指定对象元素
[marr removeObject:@"beijing"];
[marr removeObjectAtIndex:2];//删除指定位置的元素
//4,删除所有元素
//[marr removeAllObjects];
NSLog(@"%ld",marr.count);
//遍历数组元素
for (id obj in marr) {
NSLog(@"%@",obj);
}
//打印整个数组
NSLog(@"%@",marr);
}
NSArray和NSMutableArray的区别:
(1)创建方式:NSMuableArray不能用@[ ];快速创建。
(2)NSArray不能添加元素,也不能删除指定元素,不能对元素进行增删改查。
(3)遍历元素的方式一样。
<2>Set集合:
<2>Set集合:
不可变Set集合
oid set()
{
//空set
NSSet *s = [NSSet set];
//创建set集合
NSSet *s1 = [NSSet setWithObjects:@"jim",@"beijing",@"shanghai",@"jack",nil];
NSString *str = [s1 anyObject];//随机拿出一个元素
//打印set的元素个数
NSLog(@"%ld",s1.count);
//打印出随机拿出的元素
NSLog(@"%@",str);
//打印集合
NSLog(@"%@",s1);
}
NSMutableSet:可变集合
void MutableSet()
{
//创建MutableSet
//NSMutableSet *s1 = [NSMutableSet set];//创建空的可变Set集合
NSMutableSet *s = [NSMutableSet setWithObjects:@"haha",@"sichuan", nil];//创建有元素的可变Set集合
//添加元素
[s addObject:@"hainan"];
//删除指定元素
[s removeObject:@"haha"];
//打印集合
NSLog(@"%@",s);
}
<3>NSSet
和NSArray
的对比:
#1,共同点:
(1)都是集合,都能存放多个OC对象;
(2)都是只能存放OC对象,不能存放非OC对象,比如,基本数据类型:int、char、float等,结构体,枚举。
(3)本身都不可变,都有一个可变的子类。
#2,不同点:NSArray的元素是有顺序的,NSSet的元素是没有顺序的。
<4>字典NSDictionary
<4>字典NSDictionary
NSDictionary:不可变字典
void dictionary()
{
/*不可变字典
NSDictionary:字典
key------value
索引------文字内容
*/
//字典的创建1
NSDictionary *d = [NSDictionary dictionaryWithObject:@"jim" forKey:@"name"];
//字典的创建2
NSArray *key = @[@"name",@"address"];
NSArray *value = @[@"jim",@"北京"];
NSDictionary *d1 = [NSDictionary dictionaryWithObjects:value forKeys:key];
//字典的创建3
NSDictionary *d2 = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"shanghai",@"address", nil];
//字典的创建4(快速创建)
NSDictionary *d3 = @{@"name": @"jim",@"address" : @"beijing"};
//值的取出方式1
id obj = [d3 objectForKey:@"name"];
//值的取出方式2(编译器新特性)
id obj2 = d3[@"name"];
//打印出字典中的值
NSLog(@"%@ - %@ ",obj,obj2);
//打印字典
//NSLog(@"%@",d2);
//打印出字典里面的键值对个数
NSLog(@"%ld",d3.count);
}
NSMutableDictionary:可变字典
void MutableDictionary()
{
//可变字典
//创建一个空的可变字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
//添加键值对
[dict setObject:@"jim" forKey:@"name"];
[dict setObject:@"beijing" forKey:@"address"];
//会把前面的值覆盖掉
[dict setObject:@"jack" forKey:@"name"];
//取出key对应的值
NSString *str = dict[@"name"];
//打印字典中的值
NSLog(@"%@",str);
//移除键值对
[dict removeObjectForKey:@"name"];
//打印字典
NSLog(@"%@",dict);
//错误写法:不能这样写:前面是可变字典,后面的是不可变字典,会报经典错误!!
//NSMutableArray d2 = @{@"name": @"rose"};
//[d2 setObject:@"jim" forKey:@"name"];
}
字典的遍历(NSDictionary和NSMutableDictionary都可以使用)
//字典不允许有相同的key,但允许有相同的value;字典是无序的
NSDictionary *dict = @{
@"name1": @"小明",
@"name2": @"小明",
@"name3": @"小明",
@"qq":@"9827792",
@"address":@"北京",
@"address2":@"上海"};
//字典的遍历(用for循环遍历)
NSArray *keys = [dict allKeys];//先获取所以的key
for (int i = 0; i< dict.count; i++)
{
NSString *key = keys[i];//遍历所有的key
NSString *obj = dict[key];//再用key获取对应的value值
NSLog(@"%@ = %@",key,obj);
}
NSLog(@"-------------------");
//利用block遍历字典,很好用
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@ = %@",key,obj);
//*stop = YES;遍历一次就停止
}];
Foundation框架中集合类小结:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
/*集合总结
1,NSArray\NSMutableArray
*1,元素有序
*2,快速创建(不可变):@[obj1, obj2, obj3]
*3,快速访问元素:数组名[元素的位置]
2,NSSet\NSMutableSet
*1,元素无序
3,NSDictionary\NSMutableDictionary
*1,元素无序
*2,快速创建(不可变):@{key1 : value1, key2 : value2}
*3,速访问元素(值):字典名[key]
*/
//比较复杂的写法
NSArray *person = @[
@{@"name": @"jim",@"qq" : @"893899",@"books" : @[@"java宝典",@"ios宝典"]},
@{@"name": @"jack",@"qq" : @"10099922"},
@{@"name": @"小明",@"qq" : @"886698696"},
@{@"name": @"奥巴马",@"qq" : @"8498379427"},
];
//取出数组中的字典
NSDictionary *jack = person[1];
//取出@"ios宝典"
NSString *s = person[0][@"books"][1];
//取出books对应的value值--@"java宝典",@"ios宝典"
NSArray *arry = person[0][@"books"];
NSLog(@"%@",jack);
//取出数组中字典的值:先取出3位置对应的字典,再取出字典中name这个key对应的数据
NSLog(@"%@",person[3][@"name"]);
NSLog(@"%@",arry);
NSLog(@"%@",s);
return 0;
}
4,Foundation框架中包装类
NSNumber:可以把基本数据类型包装成OC对象。继承自NSValue
void NSnumber()
{
//NSNumber:可以把基本数据类型包装成OC对象,
//把double类型的数据包装成NSNumber对象
@20.5;
//把字符包装成NSNumber对象,注意同@"A"的区别 @"A":是NSString对象
@'A';
//把BOOL类型的数据包装成NSNumber对象
@YES;
//也可以把字符串转换成基本数据类型
int i = 15;
NSString *str = [NSString stringWithFormat:@"%d", i];
// NSString *str =@"15";
NSLog(@"%d", [str intValue]);
//将变量包装成NSNumber对象
int age = 10;
//@(age);这里的()是必须加的,代表着取值
NSNumber *num = [NSNumber numberWithInt:age];//也可以用@(age)代替。
//将20包装成NSNumber对象
//NSNumber *num = [NSNumber numberWithInt:20];
NSNumber *num1 = @20;//编译器新特性
NSNumber *num2 = @20.5;
//然后再将num对象存入字典
NSDictionary *dict = @{@"name" : @"jim",@"age1" : num1,@"name" : @"rose",@"age2" : num2};
//取出age对应的值
NSNumber *n1 = dict[@"age1"];
NSNumber *n2 = dict[@"age2"];
//将NSNumber对象转换成基本数据类型int类型的数据
int a = [n1 intValue];
//将NSNumber对象转换成基本数据类型double类型的数据
double b = [n2 doubleValue];
NSLog(@"%d---%0.1f",a,b);
// 运行结果:20---20.5
}
NSValue:
可以把结构体包装成
OC
对象
//NSNumber之所以能够包装基本数据类型为对象,是因为继承了NSValue
void Nsvaule()
{
//用NSValue可以把结构体包装成OC对象
CGPoint p = CGPointMake(10, 20);
CGRect r = CGRectMake(10, 20, 100, 50);
//将结构体转为Value对象
NSValue *value = [NSValue valueWithPoint:p];
NSValue *value1 = [NSValue valueWithRect:r];
//将vaule转为对应的结构体
[value pointValue];
[value1 rectValue];
}
5,Foundation框架中的NSDate类的使用
void NSdate()
{
//创建一个时间
NSDate *date = [NSDate date];
//打印出的是格林威治时间(0时区)
//NSLog(@"%@",date);
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
//从1970年开始走过的秒数
// NSTimeInterval s = [date2 timeIntervalSince1970];//NSTimeInterval == double
// NSLog(@"%f",s);
//将NSDate转换成字符串
//日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//y 年 M 月 d 日
//m 分 s 秒 H (24制)时 h(12制)时
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";//定义格式
//调用NSString的转换方法
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@",str);
//将字符串转成NSDate
NSString *time = @"2008-9-10 9:30:30";
//创建日期格式化类
NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
//定义格式
formatter2.dateFormat = @"yyyy-MM-dd HH:mm:ss";
//调用NSDate的转换方法
NSDate *d =[formatter2 dateFromString:time];
NSLog(@"%@",d);//打印出的是0时区的时间
//结果为:2008-09-10 01:30:30 +0000
}
--------------------------------------
android培训
、
java培训
、ios培训期待与您交流! ---------------------------------