objective-c 结构体

在oc中一般结构体的使用:

 1 struct Date {
 2 
 3         int year;
 4 
 5         int month;
 6 
 7         int day;
 8 
 9     };
10 
11 //按照结构赋值
12 
13 struct Date date = {2015,06,19};
14 
15  NSLog(@"%d",date.year);
16 
17 //不按照结构赋值
18 
19 struct Date date02 = {.year=2015,.month=06,.day=19};
20 
21 NSLog(@"%d",date02.year);

输入结果:

2015-06-19 10:52:04.044 test[94301:6269499] 2015

2015-06-19 10:52:04.045 test[94301:6269499] 2015

 

在oc中常使用的结构体

NSRange

NSPoint\CGPoint

NSSize \ CGSize

NSRect \ CGrect

首先先说说NSRange 按住 Commond键点击进去后 看看它的声明

1 typedef struct _NSRange {
2     NSUInteger location;
3     NSUInteger length;
4 } NSRange;

可以看出NSRange由字段location length组成,两个字段的类型都是NSUInteger 从字面理解一个是表示位置 一个是表示长度

用法举例:

1 NSString *str01 = @"My name is greenboy";
2         
3 NSRange range = NSMakeRange(0, 4);
4         
5 NSString *str02 = [str01 substringWithRange:range];
6         
7 NSLog(@"从零开始的三个字符是=%@", str02);

输出结果是:

2015-06-18 22:52:48.197 study01[1158:53923] 从零开始的三个字符是=My n

案例二:求一个字符串(greenboy)在str01里面的位置和长度

1 NSString *str01 = @"My name is greenboy";
2         
3 NSRange rang02 = [str01 rangeOfString:@"greenboy"];
4         
5 NSLog(@"loc = %lu, len = %lu",rang02.location,rang02.length);

输出结果:

2015-06-18 23:02:36.158 study01[1205:60632] loc = 11, len = 8

 

NSPoint\CGPoint

NSPoint结构体:通过一个点坐标来标识元素位置 

官方定义:

// 定义CGFLOAT_TYPE 为double类型
# define CGFLOAT_TYPE double
// 为CGFLOAT_TYPE创建一个新的名字 CGFloat
typedef CGFLOAT_TYPE CGFloat;
// 定义CGPoint结构体
struct CGPoint {
    CGFloat x;
    CGFloat y;
};
// 定义CGPoint结构体为CGPoint类型(其实这里是将struct CGPoint 的别名定义为 CGPoint)
typedef struct CGPoint CGPoint;
// 设置结构体CGPoint = NSPoint
typedef CGPoint NSPoint;<br><br>总结:可以看出CGPoint = NSPoint 本质都是结构体,里面包含了两个double类型来描述一个点
1 // 同一个点的两种表现方式
2 CGPoint point = NSMakePoint(20, 20);  // 不常用
3 NSPoint point2 = CGPointMake(20, 20); // 常用<br><br>   // CGPointZero == CGPointMake(0,0);<br>

NSSize\CGSize结构体:描述元素的尺寸(宽和高),定义和NSPoint类似不再赘述,一般用法为:

1 CGSize size = NSMakeSize(20, 40);
2 NSSize size2 = CGSizeMake(40, 20); // 常用

CGRect结构体:用于描述元素的位置(CGPoint)和尺寸(CGSize),因此可以说CGRect是描述了一个在手机屏幕上的矩形

官方定义的CGRect:

struct CGRect {
  CGPoint origin;   // 描述元素位置坐标
  CGSize size;    //  描述元素尺寸
};
typedef struct CGRect CGRect;
// 描述一个坐标位置为(20,20)宽高分别为50和100的元素
CGRect rect = CGRectMake(20, 20, 50, 100); // 常用
NSRect rect2 = NSMakeRect(20, 20, 50, 100);
 1 CGRectZero == CGRectMake(0,0,0,0);
 CGSizeZero == CGSizeMake(0,0);
 CGPointZero == CGPointMake(0,0);

// 第一种写法:坐标为(20,20)宽高分别为50和100 2 CGRect rect = {{20,50},{50,100}}; 3 4 // 第二种写法:坐标为(20,20)宽高分别为50和100 5 NSPoint point = CGPointMake(20, 20); 6 NSSize size = CGSizeMake(50, 100); 7 CGRect rect2 = {point,size}; 8 9 // 第三种写法:坐标为(0,0)宽高分别为50和100 10 CGRect rect3 = {CGPointZero,CGSizeMake(50, 100)};

如何快速查看结构体中的值

第一种方式:从结构体中将值依次取出来

1 NSRect rect = CGRectMake(20, 20, 50, 100);<br>  
2 NSLog(@"x = %f, y = %f, width = %f, height = %f",rect.origin.x, rect.origin.y
3       , rect.size.width, rect.size.height);   
4 // 这里的. 不是get方法只是单纯的从结构体中获取值而已

第二种方式:将结构体直接转换为字符串后打印

1 NSRect rect = CGRectMake(20, 20, 50, 100);
2 
3 // 先将结构体转换称为字符串
4 NSString *strRect = NSStringFromRect(rect);
5 
6 // 直接打印转换后的字符串
7 NSLog(@"%@",strRect);<br><br>  // NSSize/NSPoint这两种结构体NSStirng也提供了类似的方法

6.结构体比较常用的函数

结构体常用函数是在CoreGraphics.framework框架下面,因此需要先添加框架

 

 

较常用的方法

 1 // 1.判断两个点的位置是否相等
 2 BOOL pointIsEqual = CGPointEqualToPoint(CGPointMake(50, 100), CGPointMake(100, 50));
 3 NSLog(@"%d",pointIsEqual);
 4 
 5 // 2.判断尺寸大小是否相等
 6 BOOL sizeIsEqual = CGSizeEqualToSize(CGSizeMake(50, 100), CGSizeMake(50, 100));
 7 NSLog(@"%d",sizeIsEqual);
 8 
 9 
10 // 第一种写法:坐标为(20,20)宽高分别为50和100
11 CGRect rect1 = {{20,50},{50,100}};
12 // 第二种写法:坐标为(20,20)宽高分别为50和100
13 NSPoint point = CGPointMake(20, 20);
14 NSSize size = CGSizeMake(50, 100);
15 CGRect rect2  = {point,size};
16 
17 
18 // 3.判断两个矩形是否相等
19 BOOL rectIsEqual = CGRectEqualToRect(rect1, rect2);
20 NSLog(@"%d",rectIsEqual);
21 
22 
23 // 4.判断一个点是否在矩形上面
24 BOOL isContent = CGRectContainsPoint(rect1, CGPointMake(20, 50));
25 NSLog(@"%d",isContent);
posted @ 2015-06-18 22:27  greenboy1  阅读(1550)  评论(0编辑  收藏  举报