黑马程序员-OC常见结构体NSRange、NSPoint、NSSize、NSRect

  1. NSRange:这个结构体有两个成员变量分别是location和length,比如OC字符串@"My name is HeiMa"中‘name’的NSRange为{3,4}(空格也算)C数组中{1,4,6,7,3}6、7的NSRange为{2,2}
    1     // 第一种赋值方式,开发中很少用
    2     NSRange range1 = {2,6};
    3     // 第二种赋值方式,依然很少用
    4     NSRange range2 = {.location = 2,.length = 6};
    5     // 第三种赋值方式,通过系统提供的NSMakeRange()函数来创建一个NSRange。这种方法在开发中比较常见
    6     NSRange range3 = NSMakeRange(2, 6);

    前两种赋值方式跟C语言的结构体变量的初始化很类似,不过在OC中几乎不用,常见的是第三种通过调用函数来创建NSRange。在字符串中我们一般用到的查找其中某个子字符串范围的对象方法为-rangeOfSring:(NSString *)例如

    1     // 创建一个OC字符串
    2     NSString *str = @"My name is Bond";
    3     // 查找字符串@"name"在str中的位置
    4     NSRange range = [str rangeOfString:@"name"];
    5     // 输出range.location和range.length
    6     NSLog(@"location is %ld,length is %ld", range.location, range.length);

    输出结果为:

    2015-04-21 00:53:47.172 OC结构体[2600:536154] location is 3,length is 4      说明:range.location和range.length的数据类型为NSUInteger(即unsigned long)所以占位符为%ld(或者%lu),第四行是创建了一个OC字符串(不可变的),其次要是所找的子字符串不在内部,range.length肯定为0,那么range.location为多少呢?

    1     NSString *str = @"My name is Bond";
    2     // 查找字符串@"zhi"在str中的位置
    3     NSRange range = [str rangeOfString:@"zhi"];
    4     // 输出range.location和range.length
    5     NSLog(@"location is %ld,length is %ld", range.location, range.length);

    输出结果为

    2015-04-21 01:09:28.434 OC结构体[2650:555513] location is 9223372036854775807,length is 0

     为啥是这么大的数呢?因为一旦查询的子字符串不在内部,range.location就是NSNotFound(数值为-1)由于负数在内存中的存储方式与正数的不同才导致了这么一个结果(可以将本题中的range.location强制转换为int类型)

  2. NSPoint:它的另外一个名字叫CGPoint,开发中更常用CGPoint,因为它是跨平台的,从名字上就可以看出它表示的是一个点,它的成员变量也是两个,分别为CGFloat x和CGFloat y,CGFloat实际上就是double类型,创建一个点坐标一般有以下方法,在CGPoint有个常量CGPointZero,它等效于CGPointMake(0,0)(也就是坐标为(0,0)的位置)。
    1     //第一种创建方式
    2     CGPoint point1 = NSMakePoint(2, 5);
    3     //第二种创建方式
    4     NSPoint point2 = CGPointMake(2, 5); // 最长用CGPointMake()
  3. NSSize:和NSPoint一样,它的另外一个名字是CGSize,它表示的是一个尺寸,成员变量有两个,分别是CGFloat width和CGFloat heigth,与NSPoint一模一样,它的创建方式也是利用两个函数NSMakeSize(CGFloat, CGFloat)和CGSizeMake(CGFloat, CGFloat)。CGSizeZero也是个常量。
  4. NSRect:和前面NSPoint和NSSize一样,有一个跨平台的CGRect,它里面有两个结构体类型的成员变量,分别是NSPoint和NSSize,CGRect的创建方式有
     1     // 第一种创建方式
     2     NSRect rect1 = {2, 3, 50, 40};
     3     // 第二种创建方式
     4     NSRect rect2 = {{3, 6},{40, 30}};
     5     // 第三种创建方式
     6     CGRect rect3 = CGRectMake(2, 4, 60, 50);
     7     // 第四种创建方式
     8     CGRect rect4 = NSMakeRect(2, 4, 60, 50);
     9     // 第五种创建方式
    10     CGRect rect5 = {point1, size1};
    11     // 第六种创建方式
    12     CGRect rect6 = NSRectFromString(@"2,40,60,50");

    在ios中,手机屏幕的左上角为坐标原点,往左是横坐标的正方向,往下是纵坐标的正方向,并且一个UI元素的左上角是它的坐标,横向长度为width,纵向长度为height,有关CGRect的常见函数有

    1     // 判断一个点在不在UI元素内部,在的话返回YES,不再的话返回NO
    2     BOOL b1 = CGRectContainsPoint(CGRectMake(10, 15, 20, 30), CGPointMake(20, 25));
    3     // 判断后面的UI元素在不在前面的UI元素内部,在的话返回YES,不在的话返回NO
    4     BOOL b2 = CGRectContainsRect(CGRectMake(10, 10, 30, 35), CGRectMake(30, 30, 10, 10));

    第二行代码中CGRect的横向范围是(10,30)纵向范围是(15,35),所以b1的值是YES;第三行代码中的第一个CGRect的横向范围是(10,40)纵向范围是(10,45),第二个CGRect的横向范围是(30,40)纵向范围是(30,40)所以b2的返回值也是YES

  5. 另外CGPoint、CGSize和CGRect三者都有一个类似的函数判读同类之间是否相等:
    1 // 判断两点是否相同
    2 // 点p1
    3     CGPoint p1 = CGPointMake(5, 10);
    4 // 点p2
    5     CGPoint p2 = CGPointMake(5, 10);
    6 // 判断p1 和 p2 是否相同
    7     BOOL b1 = CGPointEqualToPoint(p1, p2);

    CGRect和CGSize也有类似的函数

原文地址:https://www.cnblogs.com/oucding/p/4443169.html