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
    评论
以下是一个简单的Objective-C实现循环队列的例子: ``` typedef struct { int *array; int front; int rear; int maxSize; } CircularQueue; CircularQueue* createCircularQueue(int maxSize) { CircularQueue *queue = malloc(sizeof(CircularQueue)); queue->maxSize = maxSize; queue->array = malloc(sizeof(int)*maxSize); queue->front = -1; queue->rear = -1; return queue; } void enqueue(CircularQueue *queue, int data) { if ((queue->front == 0 && queue->rear == queue->maxSize-1) || (queue->rear == (queue->front-1)%(queue->maxSize-1))) { NSLog(@"Queue is full"); return; } else if (queue->front == -1) { queue->front = queue->rear = 0; queue->array[queue->rear] = data; } else if (queue->rear == queue->maxSize-1 && queue->front != 0) { queue->rear = 0; queue->array[queue->rear] = data; } else { queue->rear++; queue->array[queue->rear] = data; } } int dequeue(CircularQueue *queue) { if (queue->front == -1) { NSLog(@"Queue is empty"); return -1; } int data = queue->array[queue->front]; queue->array[queue->front] = -1; if (queue->front == queue->rear) { queue->front = -1; queue->rear = -1; } else if (queue->front == queue->maxSize-1) { queue->front = 0; } else { queue->front++; } return data; } int main(int argc, char * argv[]) { @autoreleasepool { CircularQueue *queue = createCircularQueue(5); enqueue(queue, 1); enqueue(queue, 2); enqueue(queue, 3); enqueue(queue, 4); enqueue(queue, 5); enqueue(queue, 6); // full, cannot enqueue NSLog(@"Dequeue: %d", dequeue(queue)); // 1 NSLog(@"Dequeue: %d", dequeue(queue)); // 2 enqueue(queue, 7); enqueue(queue, 8); NSLog(@"Dequeue: %d", dequeue(queue)); // 3 NSLog(@"Dequeue: %d", dequeue(queue)); // 4 NSLog(@"Dequeue: %d", dequeue(queue)); // 5 NSLog(@"Dequeue: %d", dequeue(queue)); // 7 NSLog(@"Dequeue: %d", dequeue(queue)); // 8 dequeue(queue); // empty, cannot dequeue } return 0; } ``` 在这个例子中,`CircularQueue`是一个结构类型,包含一个整型数组`array`,一个表示队列头部位置的`front`,一个表示队列尾部位置的`rear`,以及队列的最大容量`maxSize`。`createCircularQueue`函数用于创建一个新的循环队列,`enqueue`函数用于将数据添加到队列中,`dequeue`函数用于从队列中取出数据。 在`enqueue`函数中,先检查队列是否已满。如果是,则输出`Queue is full`并返回。否则,检查队列是否为空。如果是,则将`front`和`rear`都设置为0,并将数据添加到`array`中。否则,检查队列尾部是否已到达数组的末尾。如果是且队列头部位置不是0,则将队列尾部位置设置为0,并将数据添加到`array`中。否则,将队列尾部位置加1,并将数据添加到`array`中。 在`dequeue`函数中,先检查队列是否为空。如果是,则输出`Queue is empty`并返回-1。否则,将队列头部位置的数据保存到`data`中,并将该位置的值设置为-1。然后,检查队列是否只有一个元素。如果是,则将`front`和`rear`都设置为-1。否则,检查队列头部位置是否已到达数组的末尾。如果是,则将`front`设置为0。否则,将`front`加1。最后,返回保存的数据`data`。 在`main`函数中,先使用`createCircularQueue`创建一个容量为5的新循环队列。然后,使用`enqueue`函数向队列中添加5个数据。再次使用`enqueue`函数添加一个数据,此时应该会输出`Queue is full`。接下来,使用`dequeue`函数从队列中取出数据,并输出取出的数据。重复执行两次,应该分别输出2和3。然后,再次使用`enqueue`函数向队列中添加两个数据。最后,使用`dequeue`函数依次取出队列中的数据,并输出每次取出的数据。最后再次使用`dequeue`函数,此时应该会输出`Queue is empty`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值