目录

Objective-C_14.Foundation框架—结构体

`

一、基本知识

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中坐标原点在左上角。