一、结构体
1、NSRange(location,length)
用NSRange来表示所在位置以及长度
NSString *str = @"love you";
NSRange range = [str rangeOfString:@"love"];
NSLog(@"loc = %ld,length = %ld",range.location,range.length );
打印出来的结果是:loc = 0 , length = 4,表示“love”是从位置0开始,长度为4
NSRange有一个快速创建的方法:NSRange range = NSMakeRange(2,4);
2、NSPoint/CGPoint
用NSPoint或CGPoint来表示点的位置(x,y)
// 点的位置
CGPoint p = {0,2};
p.x = 10;
p.y = 20;
// 直接调用函数
CGPoint p1 = CGPointMake(20, 30);
// 将结构体转为字符串
NSString *str3 = NSStringFromPoint(p1);
NSLog(@"%@",str3);
打印出来的结果是:{20,30}
// 表示原点
CGPoint P2 = CGPointZero;
// 将CGPoint类型转为NSString类型
NSString *str5 = NSStringFromPoint(P2);
NSLog(@"%@",str5);
打印出来的结果是:{0,0}
判断两个点是否重叠
BOOL pl = CGPointEqualToPoint(p, p1);
NSLog(@"%d",pl);
打印出的结果是:0
3、NSSize/CGSize
用CGSize来表示长宽
// 长度和宽度
CGSize s = {10,20};
s.width = 20;
s.height = 30;
// 将结构体转为字符串
NSString *str4 = NSStringFromSize(s);
NSLog(@"%@",str4);
CGSize s1= CGSizeMake(20, 30);
// 判断长宽是否相等
BOOL sl = CGSizeEqualToSize(s, s1);
NSLog(@"%d",sl);
打印出的结果分别为{20,30} 和 14、NSRect/CGRect
用CGRect来表示点位置和长宽
// 点位置和长宽
CGRect c = {2,3,4,5};
c.origin = p;
c.size = s;
// 将结构体转为字符串
NSString *str2 = NSStringFromRect(c);
NSLog(@"%@",str2);
CGRect c1 = CGRectMake(3, 4, 5, 6);
// 判断一个区域是否包含某个点
BOOL cl = CGRectContainsPoint(c1, p);
NSLog(@"%d",cl);
打印出的结果分别为{{10,20},{20,30}} 和 0
二、NSString与NSMutableString
1、NSString
NSString为不可变字符串,即创建了一个字符串对象之后该字符串不可改变
/**创建字符串*/
NSString *str = @"cx";
// NSString *str = [[NSString alloc] initWithString:@"wj"];
NSString *str1 = [NSString stringWithFormat:@"name = %@",str];
/**C-OC字符串转换*/
// C字符串->OC字符串
NSString *str2 = [[NSString alloc] initWithUTF8String:"cx"];
// OC字符串->C字符串
const char *str3 = [str2 UTF8String];
// URL:资源路径
// 协议头 ://路径
// file:// ->文件资源,本地资源
// ftp://
// 两种获得url的方式
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/c_xie/Object-C/ios.txt"];
NSURL *url1 = [NSURL fileURLWithPath:@"/Users/c_xie/Object-C/ios.txt"];
// 通过获取文件路径读取字符串
NSString *url_1 = @"//Users/c_xie/Object-C/ios.txt";
NSString *str6 = [NSString stringWithContentsOfFile:url_1 encoding:NSUTF8StringEncoding error:nil];
// 通过URL获取资源
NSString *str5 = [[NSString alloc] initWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:nil];
NSString *str7 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",str7);
字符串导出到新文件
[@"cx,wj" writeToFile:@"/Users/c_xie/myFile.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
// \n为换行符
NSString *str8 = @"wj\ncx";
NSURL *url2 = [NSURL fileURLWithPath:@"/Users/c_xie/myFile1.txt"];
[str8 writeToURL:url2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
2、NSMutableString
NSMutableString为可变字符串,即创建了一个字符串之后可以进行修改操作
NSMutableString *mstr = [NSMutableString stringWithFormat:@"my age is 10"];
[mstr appendString:@" 10,11"];
NSLog(@"mstr=%@",mstr);
删除某个范围内的字符串
// 用Range来确定范围
NSRange r = NSMakeRange(4, 2);
[mstr deleteCharactersInRange:r];
NSLog(@"mstr=%@",mstr);
NSRange r1 = [mstr rangeOfString:@"is"];
[mstr deleteCharactersInRange:r1];
NSLog(@"mstr=%@",mstr);
NSString类型的字符串可以有添加操作,但会产生新的对象
NSString *str9 =@"my name is cx";
// 生成一个新的字符串
NSString *str0 = [str9 stringByAppendingString:@" 10 11"];
NSLog(@"mstr=%@",str0);
三、NSArray与NSMutableArray
1、NSArray可变数组
/*
C语言数组
*/
int number[] = {0,1,2,3,4};
Person *p = [[Person alloc] init];
Person *p1 = [[Person alloc] init];
Person *person[] ={p,p1};
/*
不可变数组:NSArray
*/
// 1、创建数组
NSArray *array = [NSArray arrayWithObject:@"jack"];
// nil是数组元素的结束符
NSArray *array1 = [NSArray arrayWithObjects:@"jack",@"tom", nil];
// 快速创建一个array对象
NSArray *array2 = @[@"marry",@"mike",@"tmd"];
// NSArray的元素个数
[array2 count];
NSLog(@"%ld",array2.count);
// NSArray元素的访问
NSLog(@"%@",[array1 objectAtIndex:1]);
NSLog(@"%@",array2[0]);
2、遍历数组
for循环遍历
for (int i = 0; i<array2.count; i++) {
NSLog(@"%@",array2[i]);
}
快速遍历
for(id obj in array2)
{
//count++;
NSUInteger count1 = [array2 indexOfObject:obj];
NSLog(@"---%ld----%@",count1,obj);
}
用enumerateObjectsUsingBlock方法遍历
[array2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"====%ld====%@",idx,obj);
if(idx == 1)
{
// 停止循环
*stop = YES;
}
}];</span>
enumerateObjectsUsingBlock遍历原理
// 每遍历到一个元素就会调用一次block,并且当前元素和索引位置传给block
// ^(id obj, NSUInteger idx, BOOL *stop)会被转为
void (^myBlock)(id,NSUInteger,BOOL*) = ^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"====%ld====%@",idx,obj);
if(idx == 1)
{
// 停止循环
*stop = YES;
}
};
// enumerateObjectsUsingBlock中依然有个for循环
for (int j = 0; j<array2.count; j++) {
// 用来标记是否需要停止遍历
BOOL isStop = NO;
id obj = array[j];
myBlock(obj,j,&isStop); // BOOL* 是个指针参数,必须传入地址才能修改isStop这个变量的值
if (isStop) {
break;
}
}
3、NSMutableArray不可变数组
NSMutableArray *array3 = [NSMutableArray arrayWithObjects:@"me",@"you",nil];
// 添加元素
[array3 addObject:@"he"];
[array3 addObject:[[Person alloc] init]];
[array3 addObjectsFromArray:array1];
// 删除元素
[array3 removeAllObjects];
// 删除指定元素
[array3 removeObject:@"he"];
[array3 removeObjectAtIndex:0];
四、NSSet与NSMutableSet
1、NSSet:可变的
NSSet *s = [NSSet set];
NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
// 随机拿出一个元素
NSString *str = [s2 anyObject];
NSLog(@"%@", str);
// 获取set中元素的个数
NSLog(@"%ld", s2.count);
2、NSMutableSet:不可变的
NSMutableSet *s = [NSMutableSet set];
// 添加元素
[s addObject:@"jack"];
// 删除元素
[s removeObject:@"jack"];
3、NSSet和NSArray的对比
共同点:都是集合,都能存放多个OC对象且只能是存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举),NSSet和NSArray本身都不可变,都有一个可变的子类
不同点:NSArray有顺序,NSSet没有顺序
五、NSDictionary与NSMutableDictionary
1、NSDictionary
NSDictionary被成为OC字典,且不可变
创建NSDictionary
NSDictionary *dir = [NSDictionary dictionaryWithObject:@"cx" forKey:@"name"];
id obj = [dir objectForKey:@"name"];
NSLog(@"%@",obj);
NSArray *values = @[@"cx",@"bt",@"333"];
NSArray *keys = @[@"name",@"address",@"phone"];
NSDictionary *dic = [NSDictionary dictionaryWithObjects:values forKeys:keys];
NSLog(@"%@",dic);
NSLog(@"%@",dic[@"address"]);
快速创建字典
NSDictionary *dict = @{@"name" : @"cx",@"address" : @"bt"};
NSLog(@"%@",dict[@"address"]);</span>
遍历字典
NSArray *array = [dict allKeys];
for (int i = 0; i<dict.count; i++) {
NSLog(@"%@ = %@",array[i],dict[array[i]]);
}
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@ = %@",key,obj);
}];
2、NSMutableDictionary
NSMutableDictionary为可变字典
NSMutableDictionary *dic1 = [NSMutableDictionary dictionary];
[dic1 setObject:@"sex" forKey:@"man"];
NSLog(@"%@",dic1);
[dic1 removeObjectForKey:@"man"];
NSLog(@"-%@",dic1);
快速创建一个可变字典
NSArray *person = @[@{@"name":@"wj",@"address":@"sh",@"book":@[@"ios",@"j2ee"]},@{@"name":@"cx",@"address":@"sh"}];
NSString *Name = person[0][@"name"];
NSLog(@"%@",person[0][@"book"][0]);
NSLog(@"%@",Name);
六、NSNumber
NSNumber可用来创建一个基本类型的对象
NSNumber *num = [NSNumber numberWithInt:10];
NSDictionary *dict = @{
@"name" : @"jack",
@"age" : num
};
NSNumber *num2 = dict[@"age"];
int a = [num2 intValue];
NSLog(@"%d" , a);
快速创建一个NSNumber对象
// @20 将 20包装成一个NSNumber对像
NSArray *array = @[
@{@"name" : @"jack", @"age" : @20},
@{@"name" : @"rose", @"age" : @25},
@{@"name" : @"jim", @"age" : @27}
];
// 将各种基本数据类型包装成NSNumber对象
/*@10.5;
@YES;
@'A'; // NSNumber对象
@"A"; // NSString对象
*/
// 将age变量包装成NSNumber对象
int age = 100;
@(age);
//[NSNumber numberWithInt:age];
NSNumber *n = [NSNumber numberWithDouble:10.5];
int d = [n doubleValue];
int a = 20;
// @"20"
NSString *str = [NSString stringWithFormat:@"%d", a];
NSLog(@"%d", [str intValue]);
七、NSDate
使用NSDate可快速创建一个时间对象
// 创建一个date对象
NSDate *date = [NSDate date];
// 打印出的是格林时间 0时区,北京在东8区,相差8个小时
NSLog(@"%@",date);
// 在date的基础上加上5秒
NSLog(@"%@",[NSDate dateWithTimeInterval:5 sinceDate:date]);
// 计算自1970年起到date走过的秒数
NSTimeInterval seconds = [date timeIntervalSince1970];
NSLog(@"%f",seconds);
自定义日期格式
/**日期转为字符串*/
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 日期格式化
/*
y:年
M:月
d:日
h:时(24小时制)
H:时(12小时制)
m:分
s:秒
*/
formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
// 将日期转为字符串
NSString *str = [formatter stringFromDate:date];
NSLog(@"%@",str);
/**字符串转为日期*/
NSString *time = @"2011/09/10 18:56";
NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
formatter1.dateFormat = @"yyyy/MM/dd HH:mm";
NSDate *date1 = [formatter1 dateFromString:time];
NSLog(@"%@",date1);
八、NSValue
使用NSValue可以实现将结构体转为对象,以实现将结构体放入数组
// 结构体 -> OC对象
CGPoint p = CGPointMake(10, 10);
// 将结构体转为Value对象
NSValue *value = [NSValue valueWithPoint:p];
// 将value转为对应的结构体
CGPoint p1 = [value pointValue];
// 实现将结构体放入数组
NSArray *array = @[value];
NSLog(@"%@",array);
return 0;
九、编写一个小程序计算文件中代码的行数
#import <Foundation/Foundation.h>
NSUInteger codeLineCount(NSString *path);
int main()
{
NSString *path = @"/Users/c_xie/OC程序";
NSUInteger count = codeLineCount(path);
NSLog(@"%ld",count);
return 0;
}
NSUInteger codeLineCount(NSString *path)
{
// 1、获得文件管理者
NSFileManager *mdr = [NSFileManager defaultManager];
// 2、判断文件是否存在以及是否是文件夹
BOOL isdir = NO;
BOOL exit = [mdr fileExistsAtPath:path isDirectory:&isdir]; // 修改变量需传入isdr的地址!!
// 不存在,返回
if(!exit) return 0;
// 传入的文件是个目录directory(文件夹)
if (isdir) {
// 3、获取目录下的所有文件名
NSArray *file = [mdr contentsOfDirectoryAtPath:path error:nil];
__block int count = 0; // 代码行数
// Variable is not assignable (missing __block type specifier) 可变因素不可分配(缺少__block类型区分符)
__block NSString *fullPath;
[file enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
fullPath = [NSString stringWithFormat:@"%@/%@",path,obj]; // 不要漏写“/”
// 4、回调函数
count += codeLineCount(fullPath);
//NSLog(@"%@",fullPath);
}];
return count;
}
else
{
// 获得文件的后缀名并转为小写字母
NSString *extension = [[path pathExtension] lowercaseString];
// 过滤非.h,.m ,.c文件
if (!([extension isEqualToString:@"h"]||[extension isEqualToString:@"m"]||[extension isEqualToString:@"c"])) {
return 0;
}
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [str componentsSeparatedByString:@"\n"];
// 去掉路径中的/Users/c_xie/OC程序
NSRange range = [path rangeOfString:@"/Users/c_xie/OC程序/"];
NSString *str1 = [path stringByReplacingCharactersInRange:range withString:@""];
NSLog(@"%@ - %ld",str1,array.count);
return array.count;
}
}
该程序的执行结果如下: