-----------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -----------
一、 OC结构体
OC中给我们封装好了一些结构体供我们使用
如:
NSRange(location length) :用于标记字符串中某个字符或者字符串的位置或者长度
NSPoint\CGPoint:记录屏幕中一个点的位置。
NSSize\CGSize: 记录屏幕中区域的范围,长 和 宽。
NSRect\CGRect (CGPint CGSize):用于记录屏幕中某一确定范围,它包括:点NSPoint\CGPoint,和范围:NSSize\CGSize。这样就可以确定一个区域了。
上面的方法名有NS开头和CG开头,CG开头的结构体具有跨平台性。
在iOS中我们将屏幕的左上方设为原点。
NSRect\CGRect中计算屏幕大小方式:以点坐标向下和向左加上范围长和宽。
1. NSRange(location length)的使用
//确定 @"i love oc" 中 love的范围
//NSRange r1 = {2, 4}; // 不用
//NSRange r2 = {.location = 2, .length = 4};// 不用
//NSRange r3 = NSMakeRange(2, 4); // 掌握
NSString *str = @"i love oc";
// 查找某个字符串在str中的范围
// 如果找不到,length=0,location=NSNotFound==-1
NSRange range = [str rangeOfString:@"java"];
NSLog(@"loc = %ld, length=%ld", range.location, range.length);
在找不到字符串范围结果的时候:location=NSNotFound==-1 一般显示结果不是-1 是一串数字,是因为location类型为unsigned long 无符号 将-1以无符号的形式输出了
2.NSPoint\CGPoint 、NSSize\CGSize、NSSize\CGSize的使用
CGPoint p1 = NSMakePoint(10, 10); // 点(10, 10)
NSPoint p2 = CGPointMake(20, 20); // 最常用。点(20, 20)
NSSize s1 = CGSizeMake(100, 50); // 宽:100,高:50
NSSize s2 = NSMakeSize(100, 50); // 宽:100,高:50
CGRect r1 = CGRectMake(0, 0, 100, 50);
CGRect r2 = { {0, 0}, {100, 90}};
CGRect r3 = {p1, s2};
// 表示原点
// CGPointZero == CGPointMake(0, 0)
// 使用CGPointZero等的前提是添加CoreGraphics框架
CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
// 将结构体转为字符串
NSString *str1 = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s2);
NSString *str3 = NSStringFromRect(r3);
NSLog(@"%@--%@--%@", str1, str2, str3);
/*
输出结果:
{10, 10}--{100, 50}--{{10, 10}, {100, 50}}
结构体转换成字符串后输出相应的点坐标,范围大小和位置。
*/
/*
NSLog(@"(x=%f, y=%f), (width=%f, height=%f)", r3.origin.x, r3.origin.y, r3.size.width, r3.size.height) == NSLog(@"%@", str3);
*/
3. 结构体的一些方法
1> 比较两个点是否相同
// 比较两个点是否相同(x、y)
BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
2> 判断一个区域是否含有某个点
//区域的范围 x (50, 150) y (40 , 90)
BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(60, 45));
使用这些CGPointEqualToPoint、CGRectContainsPoint等函数的前提是添加CoreGraphics框架,Xcode6.2中不需要。
二、 字符串
1、字符串的创建
直接创建: NSString *s1 = @"jack"; ==== NSString *s2 = [[NSString alloc] initWithString:@"jack"];
字符串带参数:
int a = 10;
NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", a];
C字符串 --> OC字符串
初始化方法:initWithUTF8String
NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];
OC字符串 --> C字符串
const char *cs = [s4 UTF8String];
// NSUTF8StringEncoding 用到中文就可以用这种编码
NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];
将本地文件作为字符串导出
NSString *str5 = [[NSString alloc] initWithContentsOfFile:@"/Users/dymost/Desktop/作业.m" encoding:NSUTF8StringEncoding error:nil];
NSLog(@"\n%@", str5); // 输出结果为文件内容
将文件以字符串形式导出和保存,一般用URL。 URL也叫资源路径,分为本地文件和服务器文件。
格式 --> 协议头://路径
本地文件: file:///Users/dymost/Desktop/作业.m
网络文件:
ftp://
http://www.baidu.com
(NSString *) 在xcode6.2中不支持中文路径 !!! 否则打印无结果, 换成没有中文字符的路径,则成功
NSURL *url = [NSURL alloc] initWithString:<#(NSString *)#>
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/dymost/Desktop/作业.m"];
NSString *str6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", str6);
输出结果:2015-04-01 10:34:39.039 02-NSString字符串[568:28985] (null)
Program ended with exit code: 0
成功输出文件内容
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/dymost/Desktop/m.m"];
NSString *str6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"\n%@", str6);
xcode 6.2 fileURLWithPath 中可以出现中文字符
NSURL *url2 = [NSURL fileURLWithPath:@"/Users/dymost/Desktop/作业.m"];
NSString *str7 = [[NSString alloc] initWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
NSLog(@"\n%@", str7); // 输出文件内容
字符串还分为可变字符串和不可变字符串
一般创建的NSString 字符串是不可变字符串,既创建完后不可再改变。
可变字符串是用NSMutableString创建的,创建完后可以改变。
比如调用方法在可变字符串后面拼接字符串,调用appendString方法[字符串指针 appendString:字符串];
可变字符串的一些方法:
// 创建可变字符串
NSMutableString *s1 = @"dymost";
// 创建带有参数的可变字符串
NSMutableString *s2 = [NSMutableString stringWithFormat:@"dymost age is %d", 23];
// 在可变字符串后拼接字符串
[s1 appendString:@"age"]; // 不带参数
[s1 appendFormat:@" is %d", 23]; // 带参数
// 获取is的范围
NSRange range = [s2 rangeOfString:@"is"];
// 删除is
[s2 deleteCharactersInRange:range];
三、 OC的集合
1、 OC数组NSArray\NSMutableString
OC数组存储的时对象,在后面引用别的方法来使OC数组能存储基本数据类型。
OC数组也分为可变的和不可变的两种。
1--->不可变数组NSArray
1.OC数组的创建
[NSArray array] 一直为空
[NSArray arrayWithObject:id]; 存储单个对象
[NSArray arrayWithObject:多个对象, nil]; 存储多个对象
@[对象1, 对象2, 对象3……]; 快速创建对象
NSArray *array1 = [NSArray array];
NSArray *array2 = [NSArray arrayWithObject:@"dymost"];
NSArray *array3 = [NSArray arrayWithObjects:@"dymost", @"dimost", nil];
NSArray *array4 = @[@"dymost", @"dimost"];
OC数组中不能有nil,因为OC数组默认将nil当成OC数组元素结束的标志
OC数组可以存放不同类型的OC对象,但仅仅只能存放OC对象,基本数据类型不能存放,比如int,struct、enum等
NSArray 是不可变数组当数组创建时没有赋值初始化,将一直是空
2. 访问OC数组中元素的个数(得出数组元素个数)
点语法: 数组名.count
调用对象方法: [数组名 count];
int a = array1.count;
int b = [array1 count];
3. OC数组中元素的访问
1> 调用对象方法
[oc数组名 objectAtIndex: 位置序号]
2> OC数组名[位置序号]
NSLog(@"%@", array3[1]);
NSLog(@"%@", [array3 objectAtIndex:1]);
4.遍历数组中的对象
1>通常方法for循环,不用代码块block
Person *p1 = [[Person alloc]init];
Person *p2 = [[Person alloc]init];
Person *p3 = [[Person alloc]init];
NSArray *arr = @[p1, p2, p3];
for (int i = 0; i < arr.count; i++) {
NSLog(@"%@", arr[i]);
}
2>特殊for循环
// id obj代表数组中的每一个元素
//int i = 0;
for (id obj in arr)
{
// 找出obj元素在数组中的位置
NSUInteger i = [arr indexOfObject:obj];
NSLog(@"%ld - %@", i, obj);
}
3>利用block代码块,调数组方法 enumerateObjectsUsingBlock
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%ld - %@",idx, obj);
if (idx == 1) {
*stop = YES;
}
}];
2-->可变数组的基本使用
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];
2、 NSSet\NSMutableSet
NSSet和NSArray的对比
1> 共同点
* 都是集合,都能存放多个OC对象
* 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
* 本身都不可变,都有一个可变的子类
2> 不同点
* NSArray有顺序,NSSet没有顺序
1-->NSSet的基本使用
NSSet *s = [NSSet set]; // 创建一个空Set,直到消失都是空
NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
// 随机拿出一个元素
NSString *str = [s2 anyObject];
NSLog(@"%@", str);
// 计算Set其中存储的对象个数
NSLog(@"%ld", s2.count);
2-->NSMutableSet的基本使用
NSMutableSet *s = [NSMutableSet set];
// 添加元素
[s addObject:@"hack"];
// 删除元素
[s removeObject:<#(id)#>]; // 参数填写的是对象,写哪个对象删除哪个对象
3、 NSDictionary\NSMutableDictionary
字典中存储的对象是一对一对的,我们称之为键值对。
key ----> value
索引 ----> 文字内容
1> 创建不可变字典
// 字典存储一个键值对的方法
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"dymost" forKey:@"name"];
// 字典存储多个键值对的方法
NSArray *value = @[@"dimsot", @"beijin"];
NSArray *key = @[@"name", @"address"];
NSDictionary *dics = [NSDictionary dictionaryWithObjects:value forKeys:key];
// 或者NSDictionary *dics = [NSDictionary dictionaryWithObjects:@"dimsot", @"beijin" forKeys:@"name", @"address"];
NSDictionary *dic1 =[NSDictionary dictionaryWithObjectsAndKeys:
@"dymost",@"name",
@"北京",@"address",
@"867036316",@"QQ",
nil];
NSDictionary *dic2 = @{@"name" : @"dymost", @"address" : @"北京"};
字典是通过索引key 来寻找内容value的
id obj = [dic1 objectForKey:@"name"];
id obj1 = dic2[@"name"];
获取字典中键值对的个数
NSLog(@"\n%ld", dics.count); // .count 返回的时键值对个数
NSLog(@"%d",[dic2 count])
直接输出字典
NSDictionary *dic2 = @{@"name" : @"dymost", @"address" : @"北京"};
NSLog(@"%@", dic2);
结果是,是不能输出汉字的,且为随机输出键值对
{
address = "\U5317\U4eac";
name = dymost;
}
2> 可变字典基本使用
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// 直接初始化赋值
NSMutableDictionary *dict1 = @{@"name" : @"dymost"};
// 添加键值对
[dict setObject:@"dymost" forKey:@"name"];
[dict setValue:@"beijin" forKey:@"address"];
Person *p = [[Person alloc] init];
[dict setObject:p forKey:@"obj"];
// 移除键值对
[dict removeObjectForKey:@"name"];
NSString *str = dict[@"obj"]; // 可以将对象赋值给字符串
//打印可变字符串
NSLog(@"%@",dict1);
NSLog(@"%@", @[@"jack", @"rose"]);
3、 字典是的一些使用注意和方法
字典不允许有相同的key,但允许有相同的value(object)
字典存储的时候是无序的。
和NSArray 同类方法变量字典
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@ --- %@", key, obj);
*stop = YES;
}];
4、 字典数组相互嵌套
NSArray *arr = @[
@{@"name" : @"dymost", @"address" : @"beijin", @"book" : @[@"Object-C", @"C语言"]},
@{@"name" : @"dimost", @"QQ" : @"86703616"}
];
输出其中信息
NSString *bookName = arr[0][@"book"][1];
NSLog(@"%@", bookName);
NSArray *array =arr[0][@"book"];
NSLog(@"%@", array);
集合
1.NSArray\NSMutableArray
* 有序
* 快速创建(不可变):@[obj1, obj2, obj3]
* 快速访问元素:数组名[i]
2.NSSet\NSMutableSet
* 无序
3.NSDictionary\NSMutableDictionary
* 无序
* 快速创建(不可变):@{key1 : value1, key2 : value2}
* 快速访问元素:字典名[key]
四、 NSNumber和NSValue
这两个类就是将基本数据类型包装成类,使得OC集合可以进行存储。
1、 NSNumber
1>将int型包装成NSNumber对象
NSNumber *num = [NSNumber numberWithInt:10];
快速方法: @“10”
2> 将 NSNumber 对象转成int型
int a = [num intValue];
3> 将其他基本类型转成 NSNumber
double: @“10.3”
BOOL: @“YES”
char: @"c"
字符串: @“a”
// 将age变量包装成NSNumber对象
int age = 100;
@(age);
4> 将NSNumber转成 其他类型
方法
[NSNumber对象 doubleValue]
[NSNumber对象 charValue]
[NSNumber对象 BOOLValue]
[NSNumber对象 stringValue]
2、 NSValue
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue
NSValue不仅能转换基本数据类型,还能转换结构体
CGPoint p = CGPointMake(10, 10);
// 将结构体转为Value对象
NSValue *value = [NSValue valueWithPoint:p];
// 将value转为对应的结构体
// [value pointValue];
NSArray *array = @[value ];
五、 OC的时间的时间对象 NSDate
创建时间对象
NSDate *date = [NSDate date]; // 对象中默认记录系统时间格林时区0时区
打印时间对象
NSLog(@"%@", date);
创建比现在时间早几秒的时间对象方法
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
还有一种创建时间对象的方式,计算从1970年1月1号00时00分00秒 到现在的秒数
NSTimeInterval seconds = [date2 timeIntervalSince1970];
记录到现在的秒数
[date2 timeIntervalSinceNow];
格式化输出日期的方法
首先要创建日期格式化类
// 日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 再调用日期格式化 对象方法 dateFormat 来规定日期格式
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date = [NSDate date];
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@", str);
将字符串转换成时间对象的方法,用上面的日期格式输出
NSString *time = @"2011/09/10 18:56";
NSDate *date = [formatter dateFromString:time];
NSLog(@"%@", date);
-----------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -----------