objective-c 结构体

struct Date {

        int year;

        int month;

        int day;

    };

//按照结构赋值

struct Date date = {2015,06,19};

 NSLog(@"%d",date.year);

//不按照结构赋值

struct Date date02 = {.year=2015,.month=06,.day=19};

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键点击进去后 看看它的声明

 typedef struct _NSRange {
     NSUInteger location;
     NSUInteger length;
 } NSRange;

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

用法举例:

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

输出结果是:

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

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

 NSString *str01 = @"My name is greenboy";
         
 NSRange rang02 = [str01 rangeOfString:@"greenboy"];
         
 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类型来描述一个点
 // 同一个点的两种表现方式
 CGPoint point = NSMakePoint(20, 20);  // 不常用
 NSPoint point2 = CGPointMake(20, 20); // 常用  // CGPointZero == 
 CGPointMake(0,0);

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

CGSize size = NSMakeSize(20, 40);
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);
CGRectZero == CGRectMake(0,0,0,0);
 CGSizeZero == CGSizeMake(0,0);
 CGPointZero == CGPointMake(0,0);    

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

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

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

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

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

NSRect rect = CGRectMake(20, 20, 50, 100);

// 先将结构体转换称为字符串
NSString *strRect = NSStringFromRect(rect);

// 直接打印转换后的字符串
NSLog(@"%@",strRect);<br><br>  // NSSize/NSPoint这两种结构体NSStirng也提供了类似的方法

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

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

较常用的方法

// 1.判断两个点的位置是否相等
BOOL pointIsEqual = CGPointEqualToPoint(CGPointMake(50, 100), CGPointMake(100, 50));
NSLog(@"%d",pointIsEqual);

// 2.判断尺寸大小是否相等
BOOL sizeIsEqual = CGSizeEqualToSize(CGSizeMake(50, 100), CGSizeMake(50, 100));
NSLog(@"%d",sizeIsEqual);


// 第一种写法:坐标为(20,20)宽高分别为50和100
CGRect rect1 = {{20,50},{50,100}};
// 第二种写法:坐标为(20,20)宽高分别为50和100
NSPoint point = CGPointMake(20, 20);
NSSize size = CGSizeMake(50, 100);
CGRect rect2  = {point,size};


// 3.判断两个矩形是否相等
BOOL rectIsEqual = CGRectEqualToRect(rect1, rect2);
NSLog(@"%d",rectIsEqual);


// 4.判断一个点是否在矩形上面
BOOL isContent = CGRectContainsPoint(rect1, CGPointMake(20, 50));
NSLog(@"%d",isContent);

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值