iOS Foundation框架 -1.常用结构体的用法和输出
1.安装Xcode工具后会自带开发中常用的框架,存放的地址路径是:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/
2.在iOS开发中所有框架中Foundation框架是最基础的框架,Foundation框架里面包含了常用的类和数据类型比如结构体、枚举等
3.使用Foundation框架只要包含它的主头文件<Foundation/Foundation.h>即可,主头文件里面包含了框架中所有内容的头文件
4.Foundation框架中常用的结构体:
NSRange、NSPoint\CGPoint、NSSize\CGSize、NSRect\CGRect
(1) 一般结构体的用法如下:

// 定义结构体
struct Date {
int year;
int month;
int day;
}; // 依次按照结构体顺序为结构体赋值
struct Date date = {,,}; // 不按结构体顺序为结构体赋值
struct Date date2 = {.year=, .day=, .month=};

(2) NSRange结构体:用来描述范围
- 查看官方定义的NSRange

// 用于查看范围
typedef struct _NSRange {
NSUInteger location; // 起始位置
NSUInteger length; // 长度
} NSRange; // NSUInteger 类型为无符号类型,可以简单理解为表示正整数的类型,在NSLog输出时用ld

- NSRange的简单说明和用法

// 比如想查看字符串"I like oc"中的like在整个字符串中的范围,有三种实现方式: // 字符串总的起始位置为0空格也要计算,那么love的起始位置为2,当然love的长度为4 // 下面两种实现都是使用为NSRange结构体赋值的方式来实现
NSRange r1 = {,}; // 不推荐使用
NSRange r2 = {.location = , .length = }; // 不推荐使用 // 第三种实现方式是调用NSMakeRange()函数来实现
NSRange r3 = NSMakeRange(, ); // 推荐使用

- 查找NSString类对象中某些字符在整个类对象中的NSRange

// 比如想查看字符串"I like oc"中的like在整个字符串中的范围
NSString *str = @"I like oc"; // NSString类的分类已经对这种需求做了实现 因此可以直接调用类方法来实现
NSRange range = [str rangeOfString:@"like"]; // 打印的NSRange结构体中的变量由于都是NSUInteger类型 因此在输出时用ld
NSLog(@"location = %ld, length = %ld",range.location,rang.length);

注意:如果没有找到要查找的值NSRange中的length = 0, location = NSNotFound,其中NSNotFound如果以NSLog(@"%d",NSNotFound); 输出一长串 数字;而如果以 NSLog(@"%d",NSNotFound); 输出的就是 -1
(3)NSPoint结构体:通过一个点坐标来标识元素位置
- 官方定义的NSPoint

// 设置 double 类型的别名为 CGFLOAT_TYPE
# define CGFLOAT_TYPE double // 定义CGFloat类型为double类型
typedef CGFLOAT_TYPE CGFloat; // 定义CGPoint结构体
struct CGPoint {
CGFloat x;
CGFloat y;
}; // 定义CGPoint结构体为CGPoint类型
typedef struct CGPoint CGPoint; // 设置结构体CGPoint = NSPoint
typedef CGPoint NSPoint; 总结:可以看出CGPoint = NSPoint 本质都是结构体,里面包含了两个double类型来描述一个点

- NSPoint的一般用法
// 同一个点的两种表现方式
CGPoint point = NSMakePoint(, ); // 不常用
NSPoint point2 = CGPointMake(, ); // 常用 // CGPointZero == CGPointMake(0,0);
(3)NSSize结构体:描述元素的尺寸(宽和高),定义和NSPoint类似不再赘述,一般用法为:
CGSize size = NSMakeSize(, );
NSSize size2 = CGSizeMake(, ); // 常用
(4)CGRect结构体:用于描述元素的位置(CGPoint)和尺寸(CGSize),因此可以说CGRect是描述了一个在手机屏幕上的矩形
- 官方定义的CGRect
struct CGRect {
CGPoint origin; // 描述元素位置坐标
CGSize size; // 描述元素尺寸
};
typedef struct CGRect CGRect;
- 一般用法
// 描述一个坐标位置为(20,20)宽高分别为50和100的元素
CGRect rect = CGRectMake(, , , ); // 常用
NSRect rect2 = NSMakeRect(, , , );
- 其他用法

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

(5)模拟函数CGRectMake的实现过程

// 模拟CGRectMake方法的实现
CGRect CGRectMake2(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
// 定义一个CGRect类型的结构体rect
CGRect rect; // 为结构体内部坐标x/y赋值
rect.origin.x = x;
rect.origin.y = y; // 为结构体内部迟钝坐标width/height赋值
rect.size.width = width;
rect.size.height = height; return rect;
} // 依照这一逻辑:CGPointMake函数、CGSizeMake函数都可以模拟实现

5.如何快速查看结构体中的值
- 第一种方式:从结构体中将值依次取出来
NSRect rect = CGRectMake(, , , );
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(, , , ); // 先将结构体转换称为字符串
NSString *strRect = NSStringFromRect(rect); // 直接打印转换后的字符串
NSLog(@"%@",strRect); // NSSize/NSPoint这两种结构体NSStirng也提供了类似的方法

6.结构体比较常用的函数
- 结构体常用函数是在CoreGraphics.framework框架下面,因此需要先添加框架
- 较常用的方法

// 1.判断两个点的位置是否相等
BOOL pointIsEqual = CGPointEqualToPoint(CGPointMake(, ), CGPointMake(, ));
NSLog(@"%d",pointIsEqual); // 2.判断尺寸大小是否相等
BOOL sizeIsEqual = CGSizeEqualToSize(CGSizeMake(, ), CGSizeMake(, ));
NSLog(@"%d",sizeIsEqual); // 第一种写法:坐标为(20,20)宽高分别为50和100
CGRect rect1 = {{,},{,}};
// 第二种写法:坐标为(20,20)宽高分别为50和100
NSPoint point = CGPointMake(, );
NSSize size = CGSizeMake(, );
CGRect rect2 = {point,size}; // 3.判断两个矩形是否相等
BOOL rectIsEqual = CGRectEqualToRect(rect1, rect2);
NSLog(@"%d",rectIsEqual); // 4.判断一个点是否在矩形上面
BOOL isContent = CGRectContainsPoint(rect1, CGPointMake(, ));
NSLog(@"%d",isContent);
iOS Foundation框架 -1.常用结构体的用法和输出的更多相关文章
- iOS Foundation框架简介 -1.常用结构体的用法和输出
1.安装Xcode工具后会自带开发中常用的框架,存放的地址路径是: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.plat ...
- [OC Foundation框架 - 1] 常用结构体
底层封装是使用了typedef定义的结构体 typedef struct _NSString{ xxx xxx } NSString; 1. NSRange 结构体 #注意结构体不是对象 3种定义 ...
- iOS Foundation框架 -2.常用集合类简单总结
Foundation框架中常用的类有:NSString.NSArray.NSSet.NSDictionary 以及它们对应的子类 NSMutableString.NSMutableArray.NSMu ...
- Objective-C基础笔记(7)Foundation中的常用结构体
一.NSRange NSRange的定义: typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; N ...
- 从头开始-07.Foundation框架常用结构体
一.Foundation框架常用结构体NSRange\CGRange.NSPoint\CGPoint.NSSize\CGSize. NSRect\CGRect 的使用 1. 基本使用: //NSRa ...
- iOS Foundation 框架概述文档:常量、数据类型、框架、函数、公布声明
iOS Foundation 框架概述文档:常量.数据类型.框架.函数.公布声明 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业 ...
- iOS Foundation 框架基类
iOS Foundation 框架基类 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ...
- Foudation框架之一些常用结构体和常用类
表示范围作用的结构体:NSRange: 有三种方式创建新的NSRange: 1.NSRange range: range.location = 17; ...
- 八、Foundation -常用结构体
一.NSRange 在foundation/NSRange.h中对NSRange的定义 typedef struct _NSRange{ NSUInteger location; NSUInteger ...
随机推荐
- 使用USBASP给Arduino烧写bootloader教程
源:使用UsbAsp给UNO烧写bootloader ATMEGA16U2.ATMEGA328P固件烧写教程 arduino板由于操作不发导致固件损坏,或者想更新固件怎么办?今天给大家介绍一下如何使用 ...
- hadoop+海量数据面试题汇总(一)
hadoop面试题 Q1. Name the most common InputFormats defined in Hadoop? Which one is default ? Following ...
- NIO 入门基础
输入/输出:概念性描述 I/O 简介 I/O ? 或者输入/输出 ? 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是 ...
- jquery弹窗插件
.zhuti { position:absolute; z-index:; font-size:14px; border-radius:5px; box-shadow: 5px white; over ...
- UVa 495 - Fibonacci Freeze
题目大意:计算斐波那契数列的第n项. 由于结果会很大,要用到大数.开始本来想节省空间的,就没用数组保存,结果超时了... import java.io.*; import java.util.*; i ...
- 无锁同步-JAVA之Volatile、Atomic和CAS
1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurren ...
- UVa 341 - Non-Stop Travel
题目大意:给一个地区的地图,上面有若干路口,每个路口因为红灯的缘故要耽误一些时间,给出起点和终点,找出最短路径使得耽误时间最短. 单源最短路问题,Dijkstra算法.同时还要打印路径. #inclu ...
- [Angular Tutorial] 4 - Directory and File Organization
在这一步中,我们将不会在我们的应用中添加任何新功能,相反,我们打算退回一步,重构我们的代码库,移动我们的代码和文件,以此来使我们的应用更具易扩展性和可维护性. 在先前的步骤中,我们已经见识到了如何将我 ...
- Eclipse配置Git发布项目到Github
很牛叉的博客http://blog.csdn.net/luckarecs/article/details/7427605 一.安装插件 菜单栏Help --> Install New Softw ...
- Nodejs之package.json介绍说明
规范的package.json及package.json中各属性的作用. "name":包名. "description":包简介. "author& ...