Foundation
一、结构体
1>范围:NSRange(location length)
//NSRange r1 = {2,4}; // 不用
//NSRange r2 ={.location = 2, .length = 4};// 不用
//NSRange r3 =NSMakeRange(2, 4); // 掌握
NSString *str =@"i love oc";
// 查找某个字符串在str中的范围
NSRange range = [strrangeOfString:@"love"];
NSLog(@"loc =%ld, length=%ld", range.location, range.length);
2>点:NSPoint\CGPoint
CGPoint p1 =CGPointMake(20, 20);
NSPoint p2 =NSMakePoint(10, 10);
或者:
CGPoint p1 =NSMakePoint(10, 10);
NSPoint p2 =CGPointMake(20, 20);
// 比较两个点是否相同(x、y)
BOOL b =CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
3>尺寸:NSSize\CGSize
NSSize s1 =CGSizeMake(100, 50);
NSSize s2 =NSMakeSize(100, 50);
CGSize s3 =NSMakeSize(200, 60);
4>区域:NSRect\CGRect (CGPoint CGSize)
原理:
typedef struct_NSRect {
NSPointorigin;
NSSizesize;
} NSRect;
CGRect r1 =CGRectMake(0, 0, 100, 50);
CGRect r2 = { {0,0}, {100, 90}};
CGRect r3 = {p1,s2};
// 使用CGPointZero等的前提是添加CoreGraphics框架
CGRect r4 ={CGPointZero, CGSizeMake(100, 90)};
表示原点:CGPointZero
CGPointZero ==CGPointMake(0, 0)
//区域是否包含点
BOOL b2 =CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(60, 45));
二、NSString和NSMutableString
NSString:不可变字符串
NSMutableString:可变字符串
1.字符串的创建
NSString *s1 =@"jack";
NSString *s2 =[[NSString alloc] initWithString:@"jack"];
NSString *s3 =[[NSString alloc] initWithFormat:@"age is %d", 10];
2.C字符串 --> OC字符串
NSString *s4 =[[NSString alloc] initWithUTF8String:"jack"];
3.OC字符串 --> C字符串
const char *cs = [s4UTF8String];
4.拼接字符串
NSMutableString *s1= [NSMutableString stringWithFormat:@"my age is 10"];
// 拼接内容到s1的后面
[s1appendString:@" 11 12"];
NSString *s3 = [s2stringByAppendingString:@" 11 12"];<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
5.字符串的导出
void stringExport()
{
// 字符串的导出
[@"Jack\nJack"writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil];
NSString *str = @"4234234";
NSURL *url = [NSURLfileURLWithPath:@"/Users/apple/Desktop/my2.txt"];
[str writeToURL:url atomically:YESencoding:NSUTF8StringEncoding error:nil];
}
三、集合类:NSArray和NSMutableArray
NSArray :不可变数组
NSMutableArray : 可变数组
使用细节:
1.NSArray的创建
NSArray *array2 = [NSArrayarrayWithObject:@"jack"];
// nil是数组元素结束的标记
NSArray *array3 = [NSArrayarrayWithObjects:@"jack", @"rose", nil];
//NSArray *array4 = [NSArrayarrayWithObjects:@"jack", @"rose", @"4324324",nil];
// 快速创建一个NSArray对象
NSArray *array4 =@[@"jack", @"rose", @"4324324"];
注意:
1> @[] 只创建不可变数组NSArray。
2> OC数组不能存放nil值
3> OC数组只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等
2.NSArray的元素个数
NSLog(@"%ld", array3.count);
3.NSArray中元素的访问
NSLog(@"%@", [array3objectAtIndex:1]);
array3[1];
NSLog(@"%@", array3[0]);
//遍历数组
Person *p = [[Personalloc] init];
NSArray *array = @[p, @"rose",@"jack"];
[arrayenumerateObjectsUsingBlock:
// 每遍历到一个元素,就会调用一次block
// 并且当前元素和索引位置当做参数传给block
^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx,obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
}];
// 可变数组的基本使用
NSMutableArray*array = [NSMutableArray arrayWithObjects:@"rose", @"jim",nil];
// 添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];
// 删除元素
//[array removeAllObjects];
// 删除指定的对象
// [array removeObject:@"jack"];
[array removeObjectAtIndex:0];
// 错误写法
// [array addObject:nil];
四、集合类:NSSet和NSMutableSet
NSSet和NSArray的对比
1> 共同点
都是集合,都能存放多个OC对象
只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
本身都不可变,都有一个可变的子类
2> 不同点
NSArray有顺序,NSSet没有顺序
// set的基本使用
void test1()
{
//创建一个不可变Set
NSSet *s = [NSSet set];
//创建一个有元素的不可变Set
NSSet *s2 = [NSSetsetWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
// 随机拿出一个元素
NSString *str= [s2 anyObject];
NSLog(@"%@",str);
//打印元素个数
NSLog(@"%ld",s2.count);
}
void test2()
{
//创建一个可变Set
NSMutableSet *s= [NSMutableSet set];
// 添加元素
[s addObject:@"yang"];
// 删除元素
[s removeObject(id)];
}
五、集合类:NSDictionary和NSMutableDictionary
NSDictionary:可变字典
NSMutableDictionary:不可变字典
1.特点:
1>无序
2>快速创建(不可变):@{key1 : value1, key2 : value2}
3>快速访问元素:字典名[key]
key ----> value
索引 ----> 文字内容
里面存储的东西都是键值对
2.使用细节:
// 创建不可变字典
NSDictionary *dict =[NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
NSArray *keya =@[@"name", @"age", @"address"];
NSArray *obja =@[@"jack", @11, @"北京"];
NSDictionary *dict2 =[NSDictionary dictionaryWithObjects:obja forKeys:keya];
NSDictionary *dict3 =[NSDictionary dictionaryWithObjectsAndKeys:
@"jack", @"name",
@"北京", @"address"
,nil];
// 快速创建字典,编译器特性
NSDictionary *dict4 =@{@"name": @"jack", @"address": @"北京"};
// 访问元素
[dict objectForKey:@"name"];
// 快速访问元素,编译器特性
id obj =dict[@"name"];
// 创建可变字典
NSMutableDictionary *md =[NSMutableDictionary dictionary];
// 增加或更新元素
[md setObject:@"jack"forKey:@"name"];
[md setObject:@"北京" forKey:@"address"];
[md setObject:@"rose"forKey:@"name"];
[md setObject:@"1111"forKey:@"qq"];
// 删除元素
[mdremoveObjectForKey:@"name"];
NSLog(@"%@", md);
// 遍历
NSArray *ka = [md allKeys];
for (int i = 0; i < md.count;i++) {
NSLog(@"%@:%@",ka[i], md[ka[i]]);
}
// 遍历
[mdenumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@=%@",key, obj);
}];
六、NSNumber
数字类,将数字包装成oc对象
// 数字转NSNumber
NSNumber*num = [NSNumbernumberWithInt:11];
//NSNumber转数字
int i=[num intVaule];
@20; // 快速创建NSNumber对象,编译器特性
@10.1;
@YES;
@’a’;
int age= 20;
@(age);
七、NSValue
NSVaule:能将任何数据类型都能包装成oc对象
// 将结构体CGPoint包装成NSVaule对象
NSVaule*v = [NSVaulevauleWithPoint:CGPointMake(1, 1)];
// 从NSVaule对象获取CGPoint的值
[v pointVaule];
八、NSDate
日期
// 创建时间对象(当前时间)
NSDate*date = [NSDate date];
// 打印的时0时区时间
NSLog(@"%@", date);
// 创建比date晚5秒的时间对象
NSDate*date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
// 计算utc时间,单位:秒
/*double*/NSTimeInterval sec = [date2 timeIntervalSince1970];
// 日期格式化类
NSDateFormatter *df = [[NSDateFormatter alloc] init];
// 设计日期格式
// y 年 M 月 d 日
// m 分 s 秒 H (24)时 h (12)时
df.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 日期转字符串
NSString*ds = [df stringFromDate:date2];
NSLog(@"%@", ds);
NSString*time = @"2011/11/11 11:11";
df.dateFormat = @"yyyy/MM/dd HH:mm";
// 字符串转时间
NSDate*dt = [df dateFromString:time];
NSLog(@"%@", dt);
九、计算代码行数
//
// main.m
// 计算文件行数
#import <Foundation/Foundation.h>
NSUInteger linesFromFile(NSString *path)
{
// 获取文件管理者(单列对象)
NSFileManager *fm =[NSFileManager defaultManager];
// 是否是目录标志符
BOOL isDir = NO;
// 判断路径是否存在
BOOL isEx = [fmfileExistsAtPath:path isDirectory:&isDir];
// 路径不存在
if (!isEx) {
NSLog(@"the file ofpath:%@ is no exist!", path);
return 0;
}
// 是目录
if (isDir) {
NSUInteger count = 0;
// 获取目录中的内容:即文件和子目录
NSArray *nameArray = [fmcontentsOfDirectoryAtPath:path error:nil];
// 遍历
for (NSString *name innameArray) {
// 拼接全路径
NSString *fileName =[NSString stringWithFormat:@"%@/%@", path, name];
// 递归计算行数
count +=linesFromFile(fileName);
}
return count;
} else {
// 获取文件扩展名(忽略大小写)
NSString *extension = [[pathpathExtension] lowercaseString];
// 对文件进行过滤
if (![extensionisEqualToString:@"h"]
&& ![extensionisEqualToString:@"c"]
&& ![extensionisEqualToString:@"m"]) {
return 0;
}
// 读取文件内容
NSString *fileContents =[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncodingerror:nil];
// 通过换行符分割
NSArray *fileLines =[fileContents componentsSeparatedByString:@"\n"];
// 去掉文件的公共路径
NSRange range = [pathrangeOfString:@"/Users/zhouxf/Documents/code/"];
NSString *file = [pathstringByReplacingCharactersInRange:range withString:@""];
// 打印文件路径和行数
NSLog(@"%@:%ld",file, fileLines.count);
// 返回行数
return fileLines.count;
}
}
int main(int argc, const char * argv[])
{
NSString *path =@"/Users/zhouxf/Documents/code";
NSUInteger count = linesFromFile(path);
NSLog(@"lines count =%ld", count);
return 0;
}