您的位置:首页 > 产品设计 > UI/UE

黑马程序员——Foundation框架学习——OC结构体、字符串、OC集合、NSNumber,NSValue、OC时间对象

2015-04-07 12:32 716 查看
-----------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培训、期待与您交流! -----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐