OC的基本语法告一段落了,今天开始学习Foundation框架。
1.Foundation框架介绍
之前已经介绍了什么是框架以及如何使用一个框架。Foundation框架是其他所有iios框架的基础
Foundation框架包含了很多开发中常用的数据类型:
√结构体
√枚举
√类
要想使用Foundation框架中的数据类型,包含它的主头文件即可
#import <Foundation/Foundation.h>
下面介绍Foundation框架中的一些常见的基本用法。
2.常用结构体--NSRange、NSPoint/CGPoint、NSSize/CGSize、NSRect\CGRect
①NSRange是表示范围的结构体,它在Foundation中的定义如下:
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
可以看出NSRange有两个变量组成:
一个是代表位置的location;
一个是代表长度的length。
这两个变量的类型都是NSUInteger类型,对于NSUInteger其实就是无符号的长整型:
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
NSRange有如下的用途:
例如@"i love oc"这个字符串中,有个子串@"love",他在@"i love oc"中的范围用NSRange表示就是:location为2,length为4.
如何声明并初始化一个NSRange:按照C语言中对结构体初始化的方法:
NSRange r1 = {2, 4}; // 不用
NSRange r2= {.location = 2, .length = 4}; // 不用
上面的两种初始化方法在官方是不推荐的,它推荐使用下面的方式进行初始化:
NSRange r3 = NSMakeRange(2, 4); // 掌握
查找某个字符串在str中的范围
NSString *str = @"i love oc";
// 查找某个字符串在str中的范围
NSRange range1 = [str rangeOfString:@"love"];
NSLog(@"loc = %ld, length = %ld", range1.location, range1.length); // ->loc = 2, length = 4
如果找不到,length = 0,location=NSNotFound==-1%d
NSString *str = @"i love oc";
// 查找某个字符串在str中的范围
// 如果找不到,length = 0,location=NSNotFound==-1%d
NSRange range2 = [str rangeOfString:@"java"];
NSLog(@"loc = %ld, length = %ld", range2.location, range2.length); // ->loc = NSNotFound ,length = 0
(注:实际上上面loc的值是 9223372036854775807 它其实表示的是长整型数值的-1)
②NSPoint\CGPoint、NSSize/CGSize、NSRect\CGRect
顾名思义,我们可以猜测NSPoint表示的是点,实际上NSPoint的定义为:
typedef CGPoint NSPoint;
而CGPoint的定义为:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
显然CGPoint里面定义了表示点的两个坐标值:x和y。它们都是CGFloat类型的数据:
# define CGFLOAT_TYPE double
typedef CGFLOAT_TYPE CGFloat;
可见CGFloat其实就是double类型。
按照刚才初始化一个NSRange类型的数据的方式初始化一个NSPoint:
CGPoint p1 = NSMakePoint(10, 10);
但实际上最常用的是另一种方法:
NSPoint p2 = CGPointMake(10, 10); // 最常用
再看 NSSize/CGSize,它们在Foundation中的定义是这样的:
typedef CGSize NSSize;
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
同样地,也有初始化它们的类似方法:
NSSize s1 = NSMakeSize(100, 50);
NSSize s2 = CGSizeMake(100, 50);
再看 NSRect\CGRect,它们的定义如下:
typedef CGRect NSRect;
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
NSRect\CGRect常用来表示UI元素在屏幕中的区域,包括CGPoint类型的原点origin,和CGSize类型的size。
初始化它们有如下方法:
NSRect r1 = CGRectMake(0, 0, 100, 50); //方式1
CGRect r2 = {
{0, 0}, {100, 90}}; // 方式2
CGPoint p1 = NSMakePoint(10, 10);
NSSize s1 = NSMakeSize(100, 50);
CGRect r3 = {p1, s1}; // 方式3
也可以这样初始化:
CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
其中 CGPointZero == CGPoint(0, 0); 表示 (0, 0) 点。
在Foundation中拥有将结构体直接转为字符串的全局方法:
NSRect r1 = CGRectMake(0, 0, 100, 50);
NSString *str = NSStringFromRect(r1); // 将结构体转为字符串打印
NSLog(@"%@", str);
输出的结果为:
2014-12-28 10:52:24.514 01-结构体[615:303] {
{0, 0}, {100, 50}}
NSPoint\CGPoint、
NSSize/CGSize、NSRect\CGRect有就几个在开发中常用的函数:
// 使用这些函数的前提是添加CoreGraphic框架
// 比较两个点是否相同(x, y)
BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
BOOL b1 = CGRectContainsPoint(CGRectMake(0, 0, 100, 50), CGPointMake(2, 3));
NSLog(@"%d", b1);
输出结果为:
2014-12-28 10:55:06.695 01-结构体[626:303] 1
3.NSString类和NSMutableString类
①NSString类