`
一、基本知识
Foundation—基础框架。框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础。
如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了。
即#import<foundation/foundation.h>
补充:core foundation框架相对底层,里面的代码几乎都是c语言的,而foundation中是OC的。
二、常用的结构体介绍及简单使用
常用的结构体:
1
2
3
4
5
|
// 在Foundation框架中常用的四种结构体
NSRange; // 表示范围
CGPoint; // 表示坐标
CGSize; // 表示UI元素的尺寸
CGRect // 一个UI元素的位置和尺寸
|
(一)NSRang的基本使用
1
2
3
4
5
6
7
|
@"xiao ming love oc";
// 要利用 NSRange 表示 xiao 在字符串中的范围,应该怎么表示?
location = 0, length = 4;
{1, 2, 3, 4, 5}
// 要利用NSRange表示后三个数字在数组中的范围,应该怎么表示?
location = 2, length = 3;
|
创建变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// 结构体类型的Date定义
struct Date
{
int year;
int month;
int day;
};
// 创建一个 Date 雷雨的结构体变量,在创建的时候为变量赋值
// 第一种方式
struct Date d1 = {2016, 2, 16};
// 第二种方式
struct Date d2 = {.month = 10, .year = 2013, .day = 20};
// 使用 NSRange 创建变量
NSRange r1 = {2, 4}; //这种方式,可读性不好
NSRange r2 = {.location = 2, .length = 4}; // 代码显得比较多余
// 在实践的开发中最常用的是使用 Foundation 自带的函数即
NSRange r3 = NSMakeRange(2, 4);// 工作中使用速度方式,要求掌握
// 最简单的创建字符串的方式
NSString *str = @"xiao ming love oc";
// 查找某个字符串在 str 中的范围
// 如果找不到,length = 0, location = NSNoitFound == -1
NSRange range = [str rangeOfString:@"haha"];
NSLog(@"loc = %ld, lenth = %ld", range.location, range.length);
// 打印结果
2016-07-30 22:23:15.997 test[2461:1027839] loc = 9223372036854775807, lenth = 0
|
(二)NSPoint/CGPoint的使用
1
2
3
4
|
// NSPoint\CGPoint 表示坐标
// 开发中常使用的CGPoint,因为它是跨平台的
// 创建结构体变量
CGPoint p = CGPointMake(20, 20); // 最常用
|
(三)NSSize/CGSize的使用
1
2
3
|
// NSSize\CGSize 表示UI元素的尺寸 (宽度,高度)
// 创建结构体变量
CGSize s = CGSizeMake(100, 50); // 宽度为100, 高度为50
|
(四)NSRect/CGRect的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// CGRect {CGPoint, CGSize} 一个 UI 元素的位置和尺寸
// 第一种方式
CGRect r1 = CGRectMake(0,
0,
100,
100);
// 第二种方式
CGRect r2 = { {0, 0}, {100,90} };
// 第三种方式
CGRect r3 = {p, s};
// 第四种方式
// 使用 CGPointZero 等的,前提是添加CoreGraphics框架
CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
// CGSizeZero 表示原点
CGPointZero == CGPointMake(0, 0);
|
常规的使用方式:
在开发中,想要验证结构体中属性的值,应该如何打印?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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;
}
CGRect r = myRect(1, 2, 3, 3);
// 测试打印
NSLog(@"x = %f, y = %f, width = %f, height = %f", r.origin.x, r.origin.y, r.size.width, r.size.height);
// 打印结果
2016-07-30 22:46:40.267 test[2703:1111014] x = 1.000000, y = 2.000000, width = 3.000000, height = 3.000000
|
利用框架函数把相应的结构体转变成字符串,再直接打印字符串即可
1
2
3
4
5
|
// 利用框架函数将结构体转为字符串
NSString *str1 = NSStringFromCGPoint(CGPointMake(1, 1)); // 把坐标点转换为字符串
NSString *str2 = NSStringFromCGSize(CGSizeZero); // 把尺寸转换为字符串
NSString *str3 = NSStringFromCGRect(CGRectMake(1, 2, 3, 4)); // 把位置和尺寸转换为字符串的形式
|
(五)Foundation框架中一些经常用到的结构体函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// 使用这些 CGPointEqualToPoint, CGRectContainsPoint 等函数的前提是添加CoreGraphics框架
// 1. 比较凉快区域是否相同(x,y)
BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
// 2. 比较凉快区域是否相同
CGRectEqualToRect(CGRect rect1, CGRect rect2);
// 3. 比较两个尺寸是否相同
CGSizeEqualToSize(CGSize size1, CGSize size2);
// 4. 判断这个点是否在区域范围内
BOOL b2 = CGRectContainsPoint(CGRectMake(50, 50, 100, 50), CGPointMake(60, 60));
NSLog(@"%d", b2);
// 打印结果
2016-07-30 23:19:22.493 test[2846:1144854] 1
|
补充1:导入框架 Build phase->link
补充2:ios中坐标原点在左上角。