表示一个范围
主要用来操作字符串
代码示例:
<!-- lang: cpp -->
//NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。
//定义如下
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
//NSUInteger的本质时unsigned long类型
typedef unsigned long NSUInteger;
NSRange range = NSMakeRange(2,4); //需要记住的创建范围方式
NSString *str = @"i love oc";
//NSString的对象方法rangeOfString查找某个字符串在str中的范围
NSRange range1 = [str rangeOfString:@"ve o"]; //ve o在str字符串中的范围 4 4
//如果找不到,location=NSNoFound=-1,length=0,
NSRange range2 = [str rangeOfString:@"java"];
NSLog(@"\nlocation=%ld,length=%ld",range1.location,range1.length);
通过设置x坐标和y坐标来设置某个点
IOS设备的x和y从左上角开始,y值往下面增加,x值往右面增加
代码示例:
<!-- lang: cpp -->
//NSPoint和CGPoint相等
CGPoint p1 = NSMakePoint(30, 40);
CGPoint p2 = CGPointMake(10, 10); //开发中这个最常用
//CGPointZero代表x和y坐标都为0-----(0,0)
CGPoint p3 = CGPointZero;
//NSPoint的本质是CGPoint
typedef CGPoint NSPoint;
//CGPoint的本质
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
//比较两个点是否相同(x、y)
BOOL result1 = CGPointEqualToPoint(CGPointZero, CGPointMake(1, 0)); //0
表示一个矩形尺寸,宽高
代码示例
<!-- lang: cpp -->
//创建了两个矩形,s1的宽是100,高是60
CGSize s1 = CGSizeMake(100, 60);
NSSize s2 = NSMakeSize(100, 50);
CGSize s3 = CGSizeZero;
//CGSize的本质
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
//比较两个尺寸是否相同
BOOL result2 = CGSizeEqualToSize(CGSizeZero, CGSizeMake(0, 0)); //1
CGRect包含了一个按钮在手机屏幕上的位置,和按钮本身的宽和高
代码示例:
<!-- lang: cpp -->
//Rect的本质
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
NSPoint p1 = CGPointMake(10, 10);
CGSize s3 = NSMakeSize(200, 60);
//创建了一个Rect
CGRect c1 = {p1, s1};
//将结构体转换成字符串
NSString *str = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s1);
NSString *str3 = NSStringFromRect(r1);
//然后打印
NSLog(@"Point=%@,NSSize=%@,NSRect=%@",str,str2,str3);
//多种Rect的创建方式
CGRect c2 = {CGPointZero,CGSizeMake(100, 90)};
CGRect c3 = {CGPointMake(10, 10),CGSizeZero};
CGRect c4 = {{10,20},{200,100}};
//比较两个Rect是否相同
BOOL result3 = CGRectEqualToRect(c2, c3);
//判断一个矩形中是否包含某个点,包含返回YES(1),不包含返回NO(0)
BOOL result = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(100, 70)); //YES(1)
//将结构体转换成字符串,方便打印
NSString *str = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s1);
NSString *str3 = NSStringFromRect(r1);
NSLog(@"Point=%@,NSSize=%@,NSRect=%@",str,str2,str3);
<!-- lang: cpp -->
NSString *str1 = @"Something string..";
NSString *str3 = [[NSString alloc]initWithFormat:@"age is %d",10];
<!-- lang: cpp -->
// C字符串 -》 OC字符串
NSString *str4 = [[NSString alloc] initWithUTF8String:"jack"];
// OC字符串 -》 C字符串
const char *str5= [str4 UTF8String];
<!-- lang: cpp -->
//URL:资源路径
//协议头://路径
//file://
//ftp://
//http://weibo.com/a.jpg
//推荐用URL
//也可以抓取网页的内容,比如www.baidu.com首页
//创建一个URL,只要是URL就必须指定好协议头
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/guankunluo/Desktop/1.txt"];
//从文件读取,并创建字符串str6
NSString *s = @"/Users/guankunluo/Desktop/1.txt";
NSString *str6 = [[NSString alloc]initWithContentsOfFile:s encoding:NSUTF8StringEncoding error:nil];
//将字符串转换为file协议的地址
NSURL *url2 = [NSURL fileURLWithPath:@"/Users/guankunluo/Desktop/1.txt"];
//从URL读取内容,并创建新的字符串str7
NSString *str7 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
<!-- lang: cpp -->
//把字符串写入到文件
NSString *path = @"/Users/guankunluo/Desktop/2.txt";
//加入\n来代表换行
[@"Jack \n Jack" writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
//把字符串写入到URL
NSURL *url = [NSURL URLWithString:@"file:///Users/guankunluo/Desktop/2.txt"];
[@"lalalalala" writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
<!-- lang: cpp -->
//创建一个NSMutableString,可变
NSMutableString *str1 =[NSMutableString stringWithFormat:@"age is %d",10];
<!-- lang: cpp -->
//拼接内容到str1的结尾处,无返回值
[str1 appendString:@" 11 12"];
<!-- lang: cpp -->
//根据范围把字符串中is删除,但是str1的字符串改变,范围也就改变了,所以不好
//[str1 deleteCharactersInRange:NSMakeRange(4,2)];
//应该根据rangeOfString方法先找出is的范围
NSRange range = [str1 rangeOfString:@"is"];
//然后在把取得的范围传入删除字符串方法的参数中,这样以后再改变也会随之改变范围
[str1 deleteCharactersInRange:range];
集合只能存放OC对象,不能存放基本类型
<!-- lang: cpp -->
//集合只能存放OC对象,不能存放基本类型
//创建只有1个集合,并设置一个元素
NSArray *array01 = [NSArray arrayWithObject:@"abc"];
//nil时集合元素的结束标记,不能删除
//集合中也不能定义nil元素
//NSArray *array02 = [NSArray arrayWithObjects:@"abc",@"def", nil]; //不推荐
NSArray *array02 = @[@"abc",@"def"]; //推荐
<!-- lang: cpp -->
//[array02 count];
//array02.count 返回的是unsigned long
NSLog(@"%ld",array02.count);
<!-- lang: cpp -->
NSLog(@"%@",[array02 objectAtIndex:1]); //不推荐
NSLog(@"%@",array02[1]); //推荐
<!-- lang: cpp -->
//创建一个可变的空集合
NSMutableArray *array = [NSMutableArray array];
//初始化可变集合时,添加元素
NSMutableArray *array2 = [NSMutableArray arrayWithObjects: @"sss", @"aaa", @"bbb", nil];
//错误,@[]返回的时NSArray,所以不能用@[]创建可变集合NSMutableArray
//NSMutableArray *array3 = @[@"dd",@"dsd",@"dsd"];
<!-- lang: cpp -->
//给可变集合添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];
<!-- lang: cpp -->
//删除所有元素
[array2 removeAllObjects];
//删除指定元素
[array2 removeObject:@"aaa"];
//删除指定索引的元素
[array2 removeObjectAtIndex:1];
//删除最后一个元素
[array2 removeLastObject];
NSSet 和 NSArray的对比
共同点:
1.都是集合,都能存放多个OC对象
2.只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、float等、结构体、枚举)
3.都有一个可变的子类,本身不可变不同点:
1.NSArray有顺序,NSSet无顺序
<!-- lang: cpp -->
//错误,没有意义,创建了一个空的set集合,而且Set是不可变的
//NSSet *s = [NSSet set];
NSSet *s = [NSSet setWithObjects: @"aaa", @"bbb", @"ccc", @"ddd", nil];
//由于NSSet是无序的,所以只能随机取出元素
//随机取出元素
NSString *str = [s anyObject];
<!-- lang: cpp -->
NSMutableSet *s = [NSMutableSet set];
//添加元素
[s addObject:@"hack"];
[s addObject:@"haha"];
//删除所有元素
[s removeAllObjects];
//删除指定元素
[s removeObject:@"haha"];
字典:相当于java中的map
字典是无序的
key—-》value
索引—-》文字内容
Dictionary中存储的是键值对
Dictionary中的key不能重复,value可以重复
<!-- lang: cpp -->
//NSDictionary---不可变的字典、无序的
//创建了一个字典,但是只存储了一个键值对
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"luoguankun" forKey:@"name"];
//通过key获取value
NSString *name = [dict objectForKey:@"name"];
NSLog(@"%@",name); //luoguankun
//推荐这样访问字典中的value
id obj = dict[@"name"];
//通过传入2个不可变数组NSArray来初始化Dictionary字典集合
NSArray *key = @[@"name",@"address"];
NSArray *value = @[@"罗冠坤",@"北京"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:value forKeys:key];
//如果传入的key没有找到,就返回null,不报错
NSLog(@"%@",[dict2 objectForKey:@"address"]); //北京
//下面的写法可读性很差
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
@"luoguankun",@"name",
@"北京",@"address",nil];
//推荐使用这种方式初始化创建字典
NSDictionary *dict4 = @{@"name": @"luoguankun",@"address": @"北京"};
//返回键值对的个数,不是key+value的个数
int count = dict4.count;
<!-- lang: cpp -->
//错误!@{}返回不可变的Dictionary
//NSMutableDictionary *dict = @{@"name",@"luoguankun"};
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
//添加键值对
[dict setObject:@"luoguankun" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
//当设置了重复的key时,会覆盖以前的,所以dictionary中的key是唯一的,value可以重复
[dict setObject:@"luo" forKey:@"name"];
NSLog(@"%@",dict[@"name"]); //luo
//删除某个key所指向的键值对
[dict removeObjectForKey:@"address"];
<!-- lang: cpp -->
NSDictionary *dict = @{@"name": @"luoguankun",@"address":@"北京"};
//通过for循环遍历NSDictionary,不推荐
NSArray *keys = [dict allKeys];
for (int i = 0; i < keys.count ; i++) {
NSString *value = [dict objectForKey:keys[i]];
NSLog(@"%@---%@",keys[i],value);
}
//推荐使用这种遍历方式,通过block遍历集合
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@-%@",key,obj);
//打印一次就停止
*stop = YES;
}];
<!-- lang: cpp -->
//NSArray快速遍历
NSArray *array1 = @[@"a",@"b",@"c",@"d",@"f",@"g"];
//普通的for循环
for(int i = 0; i < array.count; i++)
{
NSLog(@"%@",array[i]);
}
<!-- lang: cpp -->
//很像java中的foreach
//id obj 代表着集合中的每一个元素
for(id obj in array1)
{
//找出obj元素在数组中的位置
unsigned long i = [array1 indexOfObject:obj];
NSLog(@"%ld=%@",i,obj);
}
<!-- lang: cpp -->
// 每遍历到一个元素,就会调用一次block
// 并且把当前元素和索引位置当做参数传给block
// stop的作用相当于break,终止循环
// 设置为YES,就停止循环
//obj代表当前元素对象
//idx代表元素下标
[array1 enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%ld = %@", idx,obj);
if(idx == 2)
{
*stop = YES;
}
}
];
//block遍历集合的本质
void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *step)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 2) {
//停止遍历
*step = YES;
}
};
for (int i = 0; i < array1.count; i++) {
//用来标记是否需要停止遍历
BOOL isStop = NO;
//取出元素
id obj = array1[i];
myblock(obj, i, &isStop);
if (isStop) {
break;
}
}
<!-- lang: cpp -->
#import <Foundation/Foundation.h>
NSUInteger codeLineCount(NSString *);
/*
考察NSString、NSArray的使用
NSFileManager
*/
int main(int argc, const char * argv[])
{
/*
分割字符串
NSString *str = @"jack-rose- jim-jake";
NSArray *array = [str componentsSeparatedByString:@"-"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
}];
*/
NSUInteger count = codeLineCount(@"/Users/guankunluo/Documents/C_Files/");
NSLog(@"该路径下所有文件共计:%ld行",count);
return 0;
}
/*
path:文件全路径
返回值:代码行数
*/
NSUInteger codeLineCount(NSString *filePath)
{
//1.获取文件管理者,它是单例类
NSFileManager *mgr = [NSFileManager defaultManager];
//2.判断path是文件夹还是文件路径,返回BOOL
BOOL dir = NO; //用来标记是否为文件夹
//这个路径是否存在,等于是返回了两个值,一个是方法返回值,一个是传进去的dir
BOOL exist = [mgr fileExistsAtPath:filePath isDirectory:&dir]; //这个方法会改变dir,因为传得是地址
//3.如果路径不存在,就直接返回0
if (!exist) {
NSLog(@"路径不存在");
return 0;
}
int count = 0;
//说明路径存在
//判断是一个文件夹,还是是一个文件
if (dir) {
//NSLog(@"是一个文件夹");
//装着当前文件夹下的所有内容(文件夹、文件)
NSArray *array = [mgr contentsOfDirectoryAtPath:filePath error:nil];
//打印出文件夹中的文件列表
//NSLog(@"%@",array);
//根据文件列表,拼接出全路径
for (NSString *filename in array) {
NSString *fullPath = [NSString stringWithFormat:@"%@%@",filePath,filename];
count += codeLineCount(fullPath);
}
} else {
//NSLog(@"是一个文件");
//4.获取文件的拓展名,并且转换成小写
NSString *extension = [[filePath pathExtension] lowercaseString];
if (![extension isEqualToString:@"h"]
&& ![extension isEqualToString:@"m"]
&& ![extension isEqualToString:@"c"])
{
//代表文件拓展名,不是m,也不是h,也不是c
return 0;
}
//加载文件内容
NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
//按指定字符串,分割字符串,返回集合
NSArray *array = [content componentsSeparatedByString:@"\n"];
//控制输出的内容,把根路径换掉
NSRange range = [filePath rangeOfString:@"/Users/guankunluo/Documents/C_Files/"];
//替换字符串
NSString *str = [filePath stringByReplacingCharactersInRange:range withString:@""];
NSLog(@"%@-%ld",str,array.count);
return array.count;
}
return count;
}