您的位置:首页 > 职场人生

黑马程序员-⑨Foundation框架(上)

2015-01-21 13:23 399 查看
------- <a href="http://www.itheima.com" target="blank">ios培训</a>、<a href="http://www.itheima.com" target="blank">ios培训</a>、期待与您交流!
---------

1. 常用结构体

   NSRange(location length)、NSPoint/CGPoint、NSSize/CGSize、NSRect\CGRect

1.1NSRange是表示范围的结构体,

   它在Foundation中的定义如下:

typedef struct _NSRange {
NSUInteger location;  //代表位置
NSUInteger length;  //代表长度
} NSRange;

   如何声明并初始化一个NSRange:

   按照C语言中对结构体初始化的方法:

NSRange r1 = {2, 4}; // 不用
NSRange r2= {.location = 2, .length = 4}; // 不用

上面的两种初始化方法是不推荐的,推荐使用下面的方式进行初始化(调用NSMakeRange函数):

NSRange r3 = NSMakeRange(2, 4); // 掌握


   NSRange常见的一个用法:

   查找某个字符串在str中的范围

NSString *str = @"i love you”;
NSRange range1 = [str rangeOfString:@"love"];
NSLog(@"loc = %ld, length = %ld", range1.location, range1.length);// ->location = 2, length = 4

   如果找不到,length = 0,location=NSNotFound==-1(%d)

   示例

NSString *str = @"i love you”;
// 查找某个字符串在str中的范围
NSRange range2 = [str rangeOfString:@"java"];
NSLog(@"loc = %ld, length = %ld", range2.location, range2.length);
// ->location = NSNotFound ,length = 0

1.2 NSPoint\CGPoint、NSSize/CGSize、NSRect\CGRect

   顾名思义,我们可以猜测NSPoint表示的是点,实际上NSPoint的定义为:

typedef CGPoint NSPoint;


 

   开发中常用CGPoint,因为CGPoint是跨平台

CGPoint的定义为:

struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;

   显然CGPoint里面定义了表示点的两个坐标值:x和y。它们都是CGFloat类型的数据,CGFloat其实就是double类型。 

   按照刚才初始化一个NSRange类型的数据的方式初始化一个NSPoint:

CGPoint p1 = NSMakePoint(10, 10);


   但实际上最常用的是另一种方法:

NSPoint p2 = CGPointMake(10, 10); // 最常用


   结构体NSSize/CGSize

   typedef CGSize NSSize;  

   开发中常用CGSize,因为CGSize是跨平台

struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;

   同样地,也有初始化它们的类似方法:

NSSize s1 = NSMakeSize(100, 50);
NSSize s2 = CGSizeMake(100, 50); //最常用

   结构体NSRect\CGRect(CGPoint CGSize)

   定义

struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;

   CGRect方法

CGRect myRect(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
CGRect rect;
rect.origin.x = x;
rect.origin.y = y;
rect.size.width = width;
rect.size.height = height;
return rect;
}


   NSRect\CGRect常用来表示UI元素在屏幕中的区域

   初始化NSRect\CGRect方法:

NSRect r1 =  CGRectMake(0, 0, 100, 50); //方式1

CGRect r2 = {{0, 0}, {100, 90}}; // 方式2

CGPoint p1 = NSMakePoint(10, 10);
NSSize s1 = NSMakeSize(100, 50);
CGRect r3 = {p1, s1}; // 方式3

   也可以这样初始化:

CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};


   其中CGPointZero == CGPoint(0, 0);表示(0, 0)点。

   在Foundation中拥有将结构体直接转为字符串的全局方法:

NSStringFromPoint(CGPoint);
NSStringFromSize(CGSize);
NSStringFromRect(CG
dfd1
Rect);


   示例

CGRect r = {CGPointZero, CGSizeMake(100, 90)};
NSString *str = NSStringFromRect(r); // 将结构体转为字符串打印
NSLog(@"%@", str);

   NSPoint\CGPoint、NSSize/CGSize、NSRect\CGRect有就几个在开发中常用的函数:

   使用CGPointZero等的前提是添加CoreGraphics框架

   比较两个点是否相同(x, y)  

BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));


   判断CGRectMake范围是否包含CGPointMake这个点

BOOL b1 = CGRectContainsPoint(CGRectMake(0, 0, 100, 50), CGPointMake(2, 3));
NSLog(@"%d", b1);


2.NSString类和NSMutableString类(父类和子类的关系)

2.1 NSString类:不可变字符串

   NSString类也就是OC中的字符串类。

   创建一个NSString对象的方法:

   1.最简单

NSString *s1 = @“jack”;


   2.最繁琐(一般不用)

NSString *s2 = [[NSString alloc] initWithString:@“jack”];


   3.创建格式化的字符串  

NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10];


   4.C语言字符串转成OC字符串  

NSString *s4 = [[NSString alloc] initWithUTF8String:"C语言字符串"];


   5.OC字符串转成c语言字符串  

const charchar *cs = [s4 UTF8String];


   还有更强大的用法,从一个文件中获取字符串:

// NSUTF8StringEncoding 用到中文就可以用这种编码
格式:
[[NSString alloc] initWithContentsOfFile:绝对地址 encoding:NSUTF8StringEncoding error:nil];
示例:
NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/Mike/Desktop/note/目标.txt" encoding:NSUTF8StringEncoding error:nil];

   从一个URL中获取字符串:

   URL : 资源路径

   协议头://路径(路径也可以是网页,例如@“www.baidu.com”)

   为此我们先定义一个URL:

NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

   以上方法可以直接使用类方法 不用每次都alloc

   一般都会有个类方法跟对象方法配对

[NSURL URLWithString:<#(NSString *)#>];//返回URL类型对象

[NSString stringWithFormat:@“”];//返回NNString类型对象

[NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:nil];

把字符串写到文件中[@"Jack\nJack" writeToFile:路径 atomically:YES encoding:NSUTF8StringEncoding error:nil];


   YES代表写入中途中断则不创作新文件  NO代表写入中途中断仍创作新文件

②NSMutableString(可变的字符串)

   NSMutableString常用的方法有,拼接字符串到当前字符串后面:

NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is %10”];


   拼接内容到s1的后面

[s1 appendString:@" 11 12"];
NSLog(@"s1 = %@", s1); // s1 = age is 10 11 12

   删除字符串中的字符:

NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 10"];
[s1 deleteCharactersInRange:NSMakeRange(4, 2)]; //删除位置(4,2)的字符串
NSLog(@"s1 = %@", s1); // s1 = age  10

   方法的简化:

[s1 deleteCharactersInRange:[s1 rangeOfString:@"is"]]; //删除字符串is
NSLog(@"s1 = %@", s1); // s1 = age  10

   NSString也可以实现上面的字符串拼接功能,但是NSString不可变,必须要用新的值就接受拼接后的字符串:

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


3.NSArray和NSMutableArray
NSArray、NSSet、NSDictionary称为集合类
 (1)NSArray是数组类可以存放一些数据,只要是对象,类型是可以不同的,且存放在NSArray中是有序的

为什么要引入NSArray数组类,先看C语言中数组的局限性:
  C语言的数组不够灵活,只能存放一种数据类型;
  C语言的数组面向过程,几乎没有什么可以操作数组的方法,且操作起来非常困难。
NSArray的要求:
  OC数组只能存放oc对象 不能存放非OC对象,如int、struct、enum等等;
  OC数组不能存放空值(数组以nil为结束)。
创建一个数组:

NSArray *array = [NSArray array];


   但是这个数组永远是空数组,因为NSArray不可变,创建时没有指定元素,所以长度为0但是又不能添加元素。
   应当这样创建:

NSArray *array2 = [NSArray arrayWithObjects:@"jack", nil ]; // 并且以nil作为结束。


  数组类的常用操作:获取数组元素的个数:

NSLog(@"%ld", array2.count); //[array count];


   访问数组的元素(按索引):

NSLog(@"%@", [array3 objectAtIndex:1]);


   简写方式:array[i];

NSLog(@"%@", array3[0]); // 编译器特性 <span style="font-family: 宋体; background-color: rgb(255, 255, 255);">  </span>


   这是种编译器特性,编译器会将array3[0]转换为 [array3 objectAtIndex:0];
   针对NSArray的编译器特性,用于快速创建数组:@[];
   NSArray *array4 = @[@"jack", @"rose"];// 编译器特性 编译器转换成arrayWithObjects方法 
 注意:
    这时候不能再加上结束标识nil,否则报错。

  数组的遍历
   方法一:

NSArray *array = @[p, @"rose", @"jack"];
for (int i = 0; i < array.count; i++)
{
NSLog(@"%@", array[i]);
}

   方法二:(for each)

// 快速遍历数组元素

for (id obj in array) //每次执行把array中一个元素赋值给obj
{
NSUInteger i = [array indexOfObject:obj]; // 找出obj元素在数组中的位置
NSLog(@"%ld----%@", i, obj);
}


   方法三:使用遍历方法enumerate并用block做参数
 

// 没遍历到一个元素,就会调用一次block
// 并且当前元素和索引位置当做参数传给block
[array enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOLBOOL *stop) {
NSLog(@"%ld---%@", idx, obj);
}];

   其内部相当于执行了下面的代码:

void ^(myblock)(id, NSUInteger, BOOLBOOL *) =
^(id obj, NSUInteger idx, BOOLBOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
};

   stop停止原理

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息