- 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类型)
时间: 2024-10-11 14:04:13