typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
可见NSRange定义了两个unsigned long类型的正整数。一个是location位置,一个是length长度。作用于字符串,数组中用于计算某个,或者某段字符串(数组)的位置和长度。
用法实现:
NSRange range =NSMakeRange(0,3);
NSString *str =@"heh ala yeah";
NSRange range1 = [strrangeOfString:@"yeah"];
NSLog(@"location = %ld,length = %ld",range1.location,range1.length);
NSRange range2 = [strrangeOfString:@"nihao"];
NSLog(@"location = %ld,length = %ld",range2.location,range2.length);
NSLog(@"%d",NSNotFound);
NSLog(@"%ld",NSNotFound);
struct CGPoint {
CGFloat x;
CGFloat y;
};
NSPoint里面有两个参数,其实就是double x和y。用来表示坐标。
用法实现:
NSPoint p1 =NSMakePoint(10,10);
CGPoint p2 = CGPointMake(10,10);
NSPoint P3 = CGPointMake(10,10);
CGPoint P4 = NSMakePoint(10,10);
struct CGSize {
CGFloat width;
CGFloat height;
};
NSSize p5 =NSMakeSize(10,10);
CGSize p6 = CGSizeMake(10,10);
struct CGRect {
CGPoint origin;
CGSize size;
};
CGRect myRect(CGFloat x,CGFloat y,CGFloat width,CGFloat height)
{
CGRect rect;
rect.origin.x = x;
rent.origin.y = y;
rent.size.width = winth;
rent.size.height = hetigt;
return rect;
}
CGRect p7 =CGRectMake(10,10,100,100);
NSMakeRect(10,10,100,100);
CGPointZero ==CGPointMake(0,0)
同样的,还是有CGSizeZero和CGRectZero。CGRange没有Zero属性。
bool a =CGPointEqualToPoint(CGPointMake(10,10),NSMakePoint(10,10));
bool b = CGSizeEqualToSize(CGSizeMake(100,100),CGSizeMake(10,10));
CGRect c1 = CGRectMake(10,10,10,10);
CGRect c2 = CGRectMake(10,10,10,10);
bool c = CGRectEqualToRect(c1, c2);
bool d =CGRectEqualToRect(CGRectMake(10,10,10,10),CGRectMake(10,10,10,10));
bool e =CGRectContainsPoint(CGRectMake(10,10,10,10),CGPointMake(15,15));
NSLog(@"%d",e);
(二)Foundation中常用的类:
Foundation框架中常用到的类有NSObject,NSDate,NSString,NSMUtableString,NSArray,NSMUtableArray,NSSet,NSMUtableSet,NSDictionary,NSMUtableDictionary。
其中有MUtable的分别是其相应的子类。
// c-->oc
NSString *str4 = [[NSStringalloc]initWithUTF8String:"黑马"];
// oc-->c
[str4UTF8String];
NSString *s1 = [[NSStringalloc]initWithContentsOfFile:@"/Users/aixiaoxin/Desktop/1.txt"encoding:NSUTF8StringEncodingerror:nil];
NSLog(@"\n%@",s1);
NSMutableString *s1 = [NSMutableStringstringWithFormat:@"hei ma hei ma"];
[s1 appendFormat:@"10 21 21"];
[s1 appendString:@"ccccc"];
NSLog(@"%@",s1);
NSRange range = [s1rangeOfString:@"ma"];
[s1 deleteCharactersInRange:range];
NSLog(@"%@",s1);
NSArray *array =@[@"hei ma",@"xunlian",@"23123"];
//遍历这个数组的三种方式:
// 1.正常循环遍历:
for (int i =0;i<array.count;i++)
{
NSLog(@"%@",array[i]);
if (i ==1)
{
break;
}
}
// 2.快速遍历:
int a = 0;
for(id objin array) // 表示遍历array这个数组的id类型oc对象
{
NSUInteger a = [arrayindexOfObject:obj];//找出obj元素在数组中的位置
NSLog(@"%ld %@",a,obj);
}
// 3.block参数遍历:
[arrayenumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop) {
NSLog(@"%ld %@",idx,obj);
if (idx ==1)
{
*stop =YES;
}
}];
int lineCount(NSString *location)
{
NSString *p = [NSStringstringWithContentsOfFile:locationencoding:NSUTF8StringEncodingerror:nil];
NSArray *a = [pcomponentsSeparatedByString:@"\n"];
int i =0;
for (NSString *strin a)
{
NSLog(@"%d %@",i,str);
i++;
}
return a.count;
}
int main()
{
int count =lineCount(@"/Users/aixiaoxin/Desktop/2.txt");
NSLog(@"%d",count);
return0;
}
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@"jom",@"dasdasdas",nil];
[array addObject:@"jack"];
[array removeObject:@"jom"];
[array removeObjectAtIndex:1];
NSLog(@"%@",array);
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"aixin" forKey:@"name"];
NSDictionary *dict2 = @{@"name" :@"aixin",@"address" :@"China"};
id obj = dict2[@"name"];
NSLog(@"%@",obj);
NSMutableDictionary *dict = [NSMutableDictionarydictionary];
[dict setObject:@"shy"forKey:@"name"];
[dict setObject:@"china"forKey:@"address"];
[dict removeObjectForKey:@"name"];
NSLog(@"%@",dict);
NSString *str = dict[@"name"];
注:数组打印是一个(),里面是数组内容,字典打印是一个{},里面一个key对应一个value。
字典遍历:字典遍历就是拿出整个字典所有的key和一一对应的value值。可是字典也是无序的,只有array才有序。字典遍历也用到一个关乎block的类方法,并且遍历方法开头基本都是enmuer。
NSDictionary *dict1 =@{@"name" :@"aixin",
@"address" :@"beijing",
@"birthday" :@"07-02",
@"home" :@"海淀",
@"cash" :@"100"};
[dict1enumerateKeysAndObjectsUsingBlock:^(id key,id obj,BOOL *stop) {
NSLog(@"%@--%@",key,obj);
}];
2015-04-08 11:33:28.793 dici[5192:988323] home--海淀
2015-04-08 11:33:28.793 dici[5192:988323] cash--100
2015-04-08 11:33:28.793 dici[5192:988323] name--aixin
2015-04-08 11:33:28.793 dici[5192:988323] birthday--07-02
2015-04-08 11:33:28.793 dici[5192:988323] address--beijing
可见排序是无序的,并且遍历最佳方法是调用遍历方法。
集合总结:
1.NSArray\NSMutableArray
有序
快速创建(不可变):@[obj1, obj2, obj3]
快速访问元素:数组名[i]
2.NSSet\NSMutableSet
无序
3.NSDictionary\NSMutableDictionary
无序
快速创建(不可变):@{key1 : value1, key2 : value2}
快速访问元素:字典名[key]
所有快速创建都是不可变的。
这些集合类只可以存放OC对象,不可以存放非OC对象。想要存放非OC对象,就要快速把它转成对象。将各种数据类型转化类OC对象用到关键字NSNumber。
int a = 100;
@(a);
char b ='c';
@(b);
@10.76;
NSArray *array =@[
@{@"name" :@"nack",@"age" :@"@(a)"},
@{@"name" :@"oom",@"age" :@"@(b)"},
@{@"name" :@"zo",@"age" :@"@10.56"},
@{@"name" :@"ka",@"age" :@"@15"}
];
其实NSNumber能包装基本类型,完全是因为继承自NSValue。NSNumber只能更改数字数据类型为Number对象,NSValue功能要比NSNumber强大,它可以更改枚举,结构体数据类型为Value类型的OC对象。之前我们学到过NSRect,NSPoint,NSRange,NSSize等常用结构体,这些结构体都可以变成OC对象,同时改变后的OC对
象也可以调用方法变回结构体:
①结构体转为value:
NSPoint p =CGPointMake(10,10);
NSValue *value = [NSValuevalueWithPoint:p];
②value转为结构体:
NSValue *value = [NSValuevalueWithPoint:p];
NSPoint p1 = [valuepointValue];
这样转化为value的结构体就可以甚至放到数组里面了。
9.NSDate:
之前我们一直用结构体表示时间。现在可以利用对象来表示时间。对象可以增加方法,这样会更方便。
NSDate *date = [NSDatedate];
// 比date晚100秒后的date1
NSDate *date1 =[NSDatedateWithTimeInterval:100sinceDate:date];
日期格式化:
想要把一个date对象显示在手机上,只能先转化成字符串。此时要先设置格式,要接触到日期格式化类。
NSDate *date = [NSDatedate];
NSDateFormatter *fomatter = [[NSDateFormatteralloc]init];
fomatter.dateFormat =@"yyyy--MM--dd--HH--mm--ss";
NSString *str = [fomatterstringFromDate:date];
NSLog(@"%@",str);
如上,yy ==年,MM ==月,dd ==日,HH ==24制小时,hh ==12制小时,mm ==分钟,ss ==秒。此时成功将date转化成为了一定格式的字符串。
当然,也可以把一个字符串转化成date对象。前提是也要用到日期格式化类。
NSString *str =@"2011-1-1 18:19:21";
NSDateFormatter *f = [[NSDateFormatteralloc]init];
f.dateFormat =@"yyyy-MM-dd HH:mm:ss";
NSDate *d = [fdateFromString:str];
NSLog(@"%@",d);
至此,Fundation框架中补充的结构体,常用类已总结完毕。方法很多,但是熟悉了后其实发现是互通的。这个结构体有这个方法,那么另一个结构体只需改下名字应该也会有这个方法。每一个对象方法一般都会有与之对应的类方法。还要熟悉一些英文的意思,enumer是遍历,append是拼接,remove是珊瑚,index是索引获取位置,format是格式,并且基本类方法都会已类名开头,initWith,类型Of/with。。这些最基本的Foundation框架代码是以后最常用的代码,多多敲打便会熟悉。