一、结构体
表示范围作用的结构体:NSRange(location length)。
创建NSRange的3种方式:
例如: @"i love oc" 找到love的范围
1.NSRange r1 = {2,4}; //不用
2.NSRange r2 = {.location = 2,.length = 4};//不用
3.NSRange r3 = NSMakeRange(2,4);//掌握
举例:
NSString *str = @"i love oc";
NSRange range = [str rangeOfString:@"ve o"];
NSLog(@"loc = %ld,length = %ld",range.location,range.length);
注:如果找不到,输出结果为:length = 0,location = NSNotFoundation/-1;
另外:
1.表示用来处理几何图形的数据类型:NSPoint/CGPoint(点坐标);
使用:CGPoint p1 = NSMakePoint(10,10);
或:NSPoint p2 = CGMakePoint(20,20);//最常用
2.NSSize/CGSize(长度和宽度);
使用:NSSize s1 = CGMakeSize(100,50);
或:NSSize s2 = NSMakeSizeI(100,50);
3.矩形数据类型(由点和大小复合而成)NSRect/CGRect;
使用:CGRect(CGPoint CGSize)
几种表示方法:(这几种存储结构)
(1)CGRect *r = {{0,0},{100,90}};
(2)CGRect *r2 = {p1,s1};
(3)CGRect *r3 = {CGPointZero,CGMakeSize(100,90)};
CGRect r1 = CGMakeRect(0,0,100,50);
NSLog(@"x=%f,y=%f,width=%f,height=%f",r1.origin.x,r1.origin.y,r1.size.width,r1.size.height);
将点坐标转化为字符串:
NSString *str = NSStringFromPoint(p1);
NSLog(@"%@",str);
结果为:{10,10}
将NSSize转化为字符串:
NSString *str2 = NSStringFromSize(s1);
NSLog(@"%@",str);
结果为:{100,50}
将矩形数据转化为字符串:
NSString *str3 = NSStringFromRect(r1);
NSLog(@"%@",str);
结果为:{{0,0},{100,50}}
表示原点的方式:
CGPointZero == CGPointMake(0,0);
CGSizeZero == CGSizeMake(0,0);
CGRectZero == CGRectMake(0,0,0,0);
结构体几种函数的简单介绍:
(使用这些函数的前提是添加CoreGraphics框架)
1.比较两个点是否相同(x,y):
BOOL b = CGPointEqualToPoint
(CGPointMake(10,10),CGPointMake(10,10));
比较CGSize和CGRect与上面的同理。
判断点是否在矩形区域内:
BOOL b2 = CGRectContainsPoint
(CGRectMake(50,40,100,50),CGPointMake(130,100));
结果:b2 = YES
注:ios坐标系是x向右增大,y向下增大。
二、字符串
表示字符串的类NSString(不可变字符串)。
NSString *heigth =
[NSString stringWithFormat : @"You heigth is %d feet,%d inches", 5,11];
创建的类对象包含了指向超类的指针、类名和指向类方法的列表的指针。类对象还包含一个long 的数据,为新创建的类对象指定大小。
字符串的创建:
NSString *s1 = @"rose";
//NSString *s2 = [[NSString alloc] initWithString:@"rose"];
NSString *s2 = [[NSString alloc] initWithFormat:@"age is %d",10];
读取文件(只是文件)内容:
NSString *s3 = [[NSString alloc] initWithContentsOfFile:
@"/Users/apple/Desktop/1.txt" encoding:NSUTF8String error:nil];
NSLog(@"%@",ss);
URL:资源路径
协议头://路径
file://
ftp://
fttp://
例如:
NSURL *url =
[[NSURL alloc] initWithString:@"file://User/apple/Desktop/1.txt"];
NSString s4 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",s4);
一般都有个类方法与对象方法配对:
创建一个字符串 : [NSString stringWithFormat:@""];
读取内容:
[NSString stringWithContentsOfFile:
(NSString *) encoding:(NSStringEncoding) error:nil];
NSURL *url2 = [NSURL URLWithString:(NSString *)];
[NSURL fileURLWithPath:@"文件路径"];
写入文件:(字符串导出)
例1:[@“jack\njack” writeToFile:@"/Users/apple/Desktop/my.txt"
Atomically:YES encoding:NSUTF9StringEncoding error:nil];
例2:NSString *str = @"12345456";
NSURL *url=[NSURL fileURLWithPath:@"/Users/apple/Desktop/my.txt"];
[str writeToURL:url atomical:YES
encoding:NSStringEncoding:NSStringEncoding error:nil];
OC字符串——>C字符串:
const char *cs = [s1 UTF8String];
C字符串——>OC字符串:
NSString *s3 = [[NSString alloc] initWithUTF8String:"rose"];
NSSMutableString(NSString 的子类,可变字符串)
创建可变字符串:
NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 10"];
拼接内容到s1的后面:
[s1 appendString:@"11 12"];
删除第四个位置2个长度的字符串:
[s1 deleteCharactersInRange:NSMakeRange(4,2)];
删除某个固定的字符串,例如要删除"is":
NSRange range = [s1 rangeOfString:@"is"];
[s1 deleteCharactersInRange:range];
对比:NSString(不可变字符串)
NSString *s2 = [NSString stringWithFormat:@"age is 10"];
在s2后面添加一个字符串,创建了一个新的字符串,s2不变:
NSString *s3 = [s2 stringByAppendingString:@"11 12"];
NSLog(@"s1=%@,s2=%@",s1,s2);
输出结果:s1="age is 10 11 12",s2="age is 10"
三、集合
一.NSArray(不可变有序数组):
注意点:oc数组不能存放nil值;
Oc数组只能存放oc对象,不能存放非oc对象类型,比如int、
struct、enum等。
创建数组:
1.NSArray *array = [NSArray array];
这个数组永远都是空数组。
2.NSArray *array1 = [NSArray arrayWithObject:@"jack",@"rose",nil];
注:nil是数组元素结束的标志,并没有存放在数组中。
表示数组元素个数:
[array1 count];// array1.count;
访问数组元素:
NSLog(@"%@",[array1 objectAtIndex:1]);
输出结果为:rose
或者:NSLog(@"%@",array1[0]);
输出结果为:jackc
编译器新特性:
快速创建一个NSArray对象:
NSArray *array2 = @[@"jack",@"rose",@"123"];
打印:
NSLog(@"%@",@[@"jack",@"rose"]);
结果是: (jack,rose)
遍历元素:
Person *p = [[Person alloc] init];
NSArray *array = @[@"jack",p];
第一种方法:
For(int i=0,i<array.count;i++)
{
NSLog(@"%@",array[i]);
}
第二种方法:
For( id obj in array) //id obj 代表着数组中的每一个元素
{
NSLog(@"%@",obj);
}
For(id obj in array)
{
//找出obj元素在数组中的位置
NSUInteger i = [array indexOfObject:obj];
NSLog(@"%ld-%@",i,obj);
If(i == 1)
{
Break;//停止遍历
}
}
第三种方法:
每遍历一个元素,就会调用block;
并且当前元素和索引当做元素传递给block:
[array enumerateObjectUsingBlock:^(id obj,NSUInteger idx,
BOOL *stop)
{
NSLog(@"%ld-%@",idx,obj);
If(idx == 0)
{
*stop = YES;//停止遍历
}
}];
分析第三种方法:
void ^(myblock)(id,NSUInteger,BOOL *)
=^(id obj,NSUInteger idx,BOOL *stop)
{
NSLog(@"%ld--%@",idx,obj);
If(idx == 0)
{
*stop = YES;
}
};
For(int i=0;i<array.count;i++)
{
//用来标记是否要停止
BOOL isStop = NO;
//取出元素
id obj = array[i];
myblock(obj,i,&isStop);
If(isStop)
{
break;
}
}
二、NSMutableArray:(可变有序数组)
创建可变数组:
NSMutableArray *array = [NSMutableArray arrayWithObjects:
@"jack",@"rose",nil];
可以添加元素:
[array addObject:[[Person alloc] init]];
[array addObject:@"jim"];
错误写法:
[array addObject:nil];
可以删除元素:
[array removeAllObkect];// 删除所有元素
[array removeObject:@"jack"];//删除指定元素
[array removeObjectAtIndex:0];//删除指定位置的元素
注:@[]只创建不可变数组NSArray
错误写法:
NSMatableArray *array = @[@"jack",@"123"];
三、NSSet(不可变的无序数组)
创建无序数组:
NSSet *s = [NSSet set];//永远为空;
NSSet *s1 = [NSSet setWithObject:@"jack",@"rose",nil];
输出数组的长度:
随机取出一个对象:
NSSet *s3 = [s1 anyObject];
四、NSMutableSet(可变的无序数组)
创建数组:
NSMutableSet *ss = [NSMutableSet setWithObject:@"jack"];
添加元素:
[ss addObject:@"rose"];
删除元素:
[ss removeObject:@"rose"];
总结,NSSet和NSArray的对比:
1.共同点:
都是集合,都能存放多个oc对象;
只能存放oc对象,不能存放非oc对象类型(基本数据类型、结构体、枚举);
本身都不变,都有一个可变子类。
2.不同点:
NSArray有序,NSSet无序。
五.字典(无序,不可变)
Key-->value
里面存储的东西都是键值对。
第一种方式创建字典:
NSDictionary *dict = [NSDictionary dictionaryWithObject:
@"jack" forKey:@"name"];
//访问元素
Id obj = [dict objectForKey:@"name"];
NSLog(@"%@",obj);
输出结果为:jack
第二种方式创建:
NSArray *keys = @[@"name",@"address"];
NSArray *objs = @[@"rose",@"北京"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:
objs forKey:keys];
第三种方式创建:
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectAndKeys:
@"jack",@"name",
@"北京",@"address",
@"12333",@"qq",nil];
编译器新特性:(快速创建)
NSDctionary *dict4 =@{@"name":@"jack",@"address":@"北京"};
快速访问:
Id obj = dict4[@"name"];
返回键值对的个数:
遍历:
NSDictionary *dict = @{@"address":@"北京",@"name":@"jack"};
第一种方式:
NSArray *keys = [dict allKeys];
For(int i=0;i<dict.count;i++)
{
NSString *key = keys[i];
NSString *object = dict[key];
NSLog(@"%@=%@",key,object);
}
第二种方式:
[dict enumerateKeysAndObjectUsingBlock:
^(id key,id obj,BOOL *stop)
{
NSLog(@"%@-%@",key,obj);
}]
六、NSMutableDictionaay(可变无序字典)
创建可变字典:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
添加键值对:
[dictionary setObject:@"jack" forKey:@"name"];
[dictionary setObject:@"北京" forKey:@"address"];
打印:
NSLog(@"%@",dict);
输出结果:
{address = "北京";
Name = "jack";}
集合总结:
1.NSArray / NSMutableArray(同一种类型对象)
*有序;
*快速创建(不可变类型):@[];
*快速访问:数组名[i];
2.NSSet / NSMutableSet(同一种类型对象)
*无序
3.NSDictionary / NSMutabledictionary(不同类型的对象)
*无序
*快速创建(不可变类型):@{key1:value1,key2:vlaue2};
*快速访问:字典名[key];
应用:
NSArray *persons = @[
@{@"name":@"jack",@"qq":@"888888"},
@{@"name":@"rose",@"qq":@"999999"},
@{@"name":@"jim",@"qq":"66666"}];
NSDictionary *jim = persons[2];
先取出1对应的字典,再取出字典中qq对应这个key对应的数据:
NSLog(@"%@",persons[1][@"qq"]);
四、NSNumber、NSValue和NSDate
一、将基本数据类型包装成NSNumber对象:
创建一个NSNumber对象:
NSNumber *n = [NSNumber numberWithDouble:10.5];
将NSNumber对象还原成基本数据类型:
Int d = [n doubleValue];
NSLog(@"%f",d); //10.5
编译器新特性:
1.将基本数据类型包装成一个NSNumber对象:
NSNumber *n1 = @20;
NSNumber *n2 = @10.5;
NSNumber *n3 = @YES;
NSNumber *n4 = @'A';
2.将变量包装成NSNumber对象:
Int age = 20;
NSNumber *n5 = @(age);
解释:NSNumber之所以能够包装基本数据类型,是因为继承了NSValue。
二、NSVable
结构体-->OC对象:
CGPoint p = CGPointMake(10,10);
NSValue *value = [NSValue valueWithPoint:p];
将转化后的对象添加进NSArray数组:
NSArray *array = @[value];
将value转化为对应的结构体:
[value pointValue];
三、NSDate(oc的时间以秒为基本单位)
创建一个时间对象:
NSDate *date = [NSDate date];
NSLog(@"%@",date);
打印出的时间是:0时区时间。
date2比date晚5秒:
NSDate *date2 = [NSDate dateWithTimeInterval:
5sinceDate:date];
从1970年1月1日开始走过的秒数:
NSTimeInterval seconds = [date2 timeIntervalSince1970];
从调用代码到date2隔了多久:
[date2 timeIntervalSinceNow];
日期格式化:
NSDateFormatter *formatter = [[NSDateFormatter alloc]
init];
// y年M月d日
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@",str);
将字符串转化为时间输出:
NSString *time = @"2011/09/01 18:66";
NSDateFormatter *formatter=[[NSDateFormatter alloc]
init];
formatter.dateFormat=[Formatter dateFromString:time];
NSLog(@"%@",date);
五、练习
计算代码行数:
/*
考察NSString、NSArray的使用
NSfileManager
*/
#import <Foundation/Foundation.h>
//计算单个文件的代码行数
/*
path:文件的全路径(可能是文件夹、可能是文件)
返回值int : 代码行数
*/
int codeLineCount(NSString *path)
{
//获得文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
//判断path是文件夹还是文件路径
BOOL dir = NO;//标记是否为文件夹
//BOOL exist = [mgr fileExi]
[NSString stringWithContentsOfFile:path atomically:YES
encoding:NSUTF8StringEncoding errer:nil];
NSLog(@"%@",content);
//将文件内容切割成每一行
NSArray *array = [content componentsSeparatedByString:@"\n"];
int i = 0;
for(NSString *line in array)
{
NSLog(@"%d - %@",i,line);
i++;
}
return array.count;
}
int main()
{
codeLineCount(@"文件夹路径");
return 0;
}
void test()
{
NSString *str = @"jack-rose-jim-jake";
NSArray *array = [str componentsSeparatedByString:@"-"];
for(NSString *line in array)
{
NSSLog(@"%@",line);
}
int count = codeLineCount(@"../Person.m");
NSLog(@"count=%d",count);
}