------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、 结构体的分类:
NSRange (location length)
NSPoint \ CGPoint
NSSize \ CGSize
NSRect \ CGRect
1. NSRange是表示范围的结构体,它在Foundation中的定义:
<span style="font-size:18px;">typedef struct _NSRange
{
NSUInteger location ; 代表位置
NSUInteger length ; 代表长度
}NSRange ;
</span>
声明并进行初始化一个NSRange:
按照C语言中对结构体初始化化的方法:
<span style="font-size:18px;">NSRange r1 = { 2, 4 } ; // 不用
NSRange r2 = {.location = 2 , .length = 4 } ; // 不用</span>
这两种初始化方法只需了解,一般不建议使用。
另一种初始化的方法调用:NSMakeRange函数,如下
<span style="font-size:18px;">NSRang r3 = NSMakeRange ( 2 , 4 ) ; // 掌握</span>
查找某个字符串在str中的范围
<span style="font-size:18px;">NSString *str = @"I love oc" ;
NSRang range1 = [str rangeOfstring:@"love"] ;
NSLog(@"loc = %ld , length = %ld ", range1.location , range1.length ) ;
</span>
如果找不到length = 0; location = NSNotFound ,这里的location 为一串地址码,按一般数据类型输出它的值为-1。
例如:
<span style="font-size:18px;">NSRang range = [str rangeOfstring: @"java"] ; // 查找某个字符串在str中的范围
NSLog (@"loc =%ld , length = %ld" , range.location , range.length) ;</span>
2. NSPoint \ CGPoint、NSSize \ CGSize、NSRect \ CGRect
这里的NSPoint表示的是一个点,实际上NSPoint 的定义为:
<span style="font-size:18px;">1> typedef CGPoint NSPoint ;
</span>
开发中经常用CGPoint ,因为CGPoint是跨平台
CGPoint定义为如下:
<span style="font-size:18px;">struct CGPoint
{
CGFloat X ;
CGFloat Y ;
} ;
typedef struct CGPoint CGPoint ;</span>
CGPoint 里面定义了表示点的两个坐标值:x 和 y。它们都是CGFloat类型的数据,CGFloat 其实就是double类型。
按照刚才初始化一个NSRange类型的数据的方式初始化一个NSPoint:
<span style="font-size:18px;">CGPoint p1 = NSMakPoint (10 , 10 ) ;</span>
但实际上最常用的是另一种方法:
<span style="font-size:18px;">NSPoint p2 = CGPoint ( 10 , 10 ) ; // 最常用</span>
2> 结构体NSSize / NSSize
typedef CGSize NSSize ;
平时开发中常用CGSize , 因为CGSize 是跨平台
<span style="font-size:18px;">struct CGSize
{
CGFloat width ;
CGFloat height ;
};
typedef struct CGSize CGSize ;</span>
和它类似的方法还有:
<span style="font-size:18px;">NSSize s1 = NSMakeSize(100, 50) ;
NSSize s2 = CGSizeMake(100, 50) ; // 最常用
</span>
3> 结构体NSRect / CGRect(CGPoint CGSize)
定义
<span style="font-size:18px;">struct CGRect
{
CGPoint origin ;
CGSize size ;
};
typedef struct CGRect CGRect ;</span>
CGRect 方法
<span style="font-size:18px;">CGRect myRect (CGFloat x, CGFloat width, CGFloat height)
{
CGRect rect ;
rect .origin .x = x ;
rect .origin .y = y ;
rect .size .width = width ;
rect .size .height = height ;
return rect ;
}</span>
NSRect / CGRect 常用来表示UI元素在屏幕中的区域
初始化NSRect CGRect 的方法如下:
<span style="font-size:18px;">NSRect r1 = CGRectMake(0, 0, 100, 50); // 方式1
</span><pre name="code" class="objc"><span style="font-size:18px;">CGRect r = { CGPointZero , CGSizeMake(100 , 90)} ;
NSString *str = NSStringFromRect(r) ; // 将结构体转为字符串打印
NSLog(@"%@",str) ;</span>
CGRect r2 = {{0, 0} , {100, 90}} ; // 方式2 CGPoint p1 = NSMakePoint(10 , 10) ;NSSize s1 = NSMakeSize(100 , 50) ;CGRect r3 = {p1 , s1}; // 方式3 或者这样进行初始化:
<span style="font-size:18px;">CGRect r4 = { CGPointZero , CGSizeMake(100 ,90) } ;</span>
这里的CGPointZero == CGPoint (0 , 0) ;表示(0 , 0)点。在Foundation中拥有将结构体直接转为字符串的全局方法:
<span style="font-size:18px;">NSStringFromPoint(CGPoint) ;
NSStringFromSize(CGsize) ;
NSStringFromrect(CGRect) ;
</span>
例如:
<span style="font-size:18px;">CGRect r = {CGPoint ,CGSize(100 , 90)};
NSString *str = NSStringFromRect(r); // 将结构体转为字符串打印
NSLog(@"%@", str) ;</span>
注意使用CGPointZero等的前提是添加 CoreCraphics框架
比较两个点是否相同(x , y)
<span style="font-size:18px;">Bool b = CGPointEqualToPoint( CGPointMake(10 ,10), CGPointMake(10 ,10) );</span>
判断CGRectMake范围是否包含CGPointMake 这个点
<span style="font-size:18px;">BOOL b1 = CGRectContainsPoint(CGRectMake (0 , 0 , 100, 50), CGPointMake(2, 3)) ;
NSLog(@"%d", b1) ;</span>
二 、NSSting 类和NSMutableString 类(父类和子类的关系)
1.NSString类也就是OC中的字符串类。
创建一个NSString对象的方法:
1> 最简单的一种:
<span style="font-size:18px;">NSString *s1 = @"jack" ;
</span>
2> 最繁琐的(一般不用):
<span style="font-size:18px;">NSString *s2 = [[NSString alloc] initWithString:@"jack"] ;
</span>
<span style="font-size:18px;">NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10] ;</span>
4> C语言字符串转化成OC字符串:
<span style="font-size:18px;">NSString *s4 = [[NSString alloc] initWithUTF8String:"C语言字符串"] ;
</span>
5> OC字符串转成C语言字符串:
<span style="font-size:18px;">const charchar *cs = [s4 UTF8String];</span>
其他强大的用法,从一个文件中获取字符串:
<span style="font-size:18px;">// NSUTF8StringEncoding 用到中文就可以用这种编码
格式:
[[NSString alloc] initwithContentsOfFile:绝对地址 encoding:NSUTF8StringEncoding error : nil];
例如:
NSString *sS = [[NSString alloc] initWithContentsOfFile:@"/users/Mike/Desktop/note/目标.txt" encoding:NSUTF8StringEncoding error:nil] ;
</span>
从一个URL中获取字符串:
URL:资源路径
协议头://路径(路径也可以是网页,例如@“www.baidu.com”)
为此我们先定义一个URL:
<span style="font-size:18px;">NSURL *ur1 = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"] ;
NSURL *ur1 = [[NSURL fileURLWithpath:@"/users/apple/Desktop/1.txt"]] ;
NSString *s6 =[[NSString alloc] initWithContentsOfURL:ur1 encoding:NSUTF8StringEncoding error:nil] ;
</span>
以上方法可以直接使用类似方法 不用每次都alloc
一般都会每个类方法跟对象方法配对
<span style="font-size:18px;">[NSURL URLWith:<#(NSString *)#>] ; // 返回URL类型对象
[NSString stringWithFormat:@""] ; // 返回NSString 类型对象
[NSString StringWithContentsOfFile:<#(NSString *)#> encoding:<:#(NSStringEncoding)#> error: nil]; //
</span>
把字符串写到文件中[@"Jack/nJack" writeToFile:路径 atomically:YES encoding:NSUTF8StringEncoding error:nil] ;
YES代表写入中途中断则不创作新文件 NO代表写入中途中断仍创作新文件
2. 可变的字符串NSMutableString
NSMutableString常用的方法有,拼接字符串到当前字符串后面:
<span style="font-size:18px;">NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is %10"] ;
</span>
拼接内容到s1的后面
<span style="font-size:18px;">[s1 appendString:@"11 12"] ;
NSLog(@"s1 = %@",s1); // s1 = age is 10 11 12</span>
删除字符串中的字符:
<span style="font-size:18px;">NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 10"] ;
[s1 deleteCharactersInRange:NSMakeRange(4 , 2)] ; // 删除位置(4 , 2)的字符串
NSLog(@"s1 = %@" , s1) ; // s1 = age 10</span>
方法的简化:
<span style="font-size:18px;">[s1 deleteCharctersInRange:[s1 rangeOfString:@"is"]] ; // 删除字符串is
NSLg(@"s1 = %@",s1) ; // s1 = age 10</span>
NSString也可实现上面的字符串拼接功能,但是NSString不可变,必须要用新的值就接受拼接的字符串:
<span style="font-size:18px;">NSString *s2 = [NSString stringWithFormat:@"age is 10"] ;
NSString *s3 = [s2 stringByAppendingString:@"11 12"] ; // s2不变 新的字符串用s3接收
NSLog(@"s2 = %@, s3 = %@", s2 , s3) ; // s2 = age is 10 , s3 = age is 10 11 12 </span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;color:#ffffff;background-color: rgb(0, 0, 0);">三、 NSArray 和NSMutableArray</span>
<span style="font-size:18px;">NSArry、 NSSet、 NSDictionary 称为集合类</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">1> NSArray 是数组类可以存放一些数据,只有是对象,类型是可以不同的,且存放在NSArray中是有序的</span>
<span style="font-size:18px;">为什么要引入NSArray数组类,先看C语言中数组的局限性:</span>
<span style="font-size:18px;"> C语言的数组不够灵活,只能存放一种数据类型;</span>
<span style="font-size:18px;"> C语言的数组面向过程,几乎没有什么可以操作数组的方法,且操作起来非常困难。</span>
<span style="font-size:18px;">NSArray的要求:</span>
<span style="font-size:18px;"> OC数组只能存放OC对象 不能存放非OC对象,如:int、 struct、 enum等等;</span>
<span style="font-size:18px;"> OC数组不能存放空值(数组以nil为结束)。</span>
<span style="font-size:18px;">创建一个数组:</span>
<pre name="code" class="objc"><span style="font-size:18px;">NSArray *array = [NSArray array] ;
</span>
但是这个数组永远是空数组,因为、NSArray不可变,创建时没有指定元素,所以长度为0但又不能添加元素。
应当这样创建:
<span style="font-size:18px;">NSArray *array2 = [NSArray arrayWithObject:@"jack , nil"] ; // 并且以nil作为结束</span>
<span style="font-size:18px;">NSLog(@"%d",arry2.count) ; // [array count]</span>
访问数组的元素(按索引):
<span style="font-size:18px;">NSLog(@"%@",[array3 objectAtIndex:1]);
</span>
简写方式:arr [ i ] ;
<span style="font-size:18px;">NSLog (@"%@", array3[0]); // 编译器特性</span>
这是一种编译器特性,编译器会将array3[0]转换为 [array3 objectAtIndex:0] ;
针对NSArray的编译器特性,用于快速创建数组:@ [ ] ;
NSArray *array4 = @[@"jack",@"rose"] ; // 编译器特性 编译器转换成arrayWithObjects方法
注意:
这时候不能再加上结束标识nil , 否则会报错。
关于数组的遍历
方法1:
<span style="font-size:18px;">NSArray *array = @[p, @"rose, @jack"] ;
for(int i =0;i<array.count;i++)
{
NSLog( @"%@", array[ i ] );
}</span>
方法2:
<span style="font-size:18px;"> // 快速遍历数组元素
for(id obj in array)// 每次执行把array中一个元素赋值给obj
{
NSUInteger i = [array indexOfObject:obj] ; // 找出obj元素在数组中的位置
NSLog(@"%ld---%@", i ,obj) ;
}</span>
方法3:
使用遍历方法enumerate并用block做参数
<span style="font-size:18px;">// 没遍历到一个元素,就会调用一次block
// 并且当前元素和索引位置当做参数传给block
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOLBOOL *stop)
{
NSLog(@"%ld---%d", idx , obj) ;
}]</span>
其内部相当于执行了下面的代码:
<span style="font-size:18px;">void ^(myblock)(id, NSUInteger, BOOLBOOL *) = ^(id obj, NSUInteger idx, BOOLBOOL *stop)
{
NSLog(@"%ld - %@", idx , obj) ;
}</span>
stop 停止原理:
<span style="font-size:18px;">void ^(myblock)(id , NSUInteger, BOOLBOOL *) = ^(id obj, NSUInteger idx,BOOLBOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
if(idx ==1) // 当idx 等于1的时候停止
{
*stop = YES;
}
};
for循环中
for(int i=0;i<array.count;i++)
{
// 用来标记是否需要停止遍历
BOOL isStop = No;
// 取出元素
id obj = array[i];
myblock(obj , i , &isStop);
if(isStop)
{
break ;
}
}</span>