------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员-iOS基础-Foundation框架基础
一、Foundation框架基础
作用:Foundation框架是其他所有IOS框架的基础
包含了很多开发中常用的数据类型:结构体;枚举;类等。
使用方法: 想要使用Foundation框架中的数据类型,包含它的主文件即可
二、OC结构体
1、NSRange(范围)
成员:
location位置:NSUInteger
length长度:NSUInteger
定义方式
要求掌握
NSMakeRange(int location, int length);
NSString的rangeOfString方法
在查找字符串的情况下,如果可以查找到,则location是有一个正值的,但如果查找不到,返回的是NSNotFound,而且NSNotFound=-1。
2、NSPoint/CGPoint
成员:两个CGFloat/double型变量x和y
作用:用来表示屏幕上的一个点
定义方式
开发中常用CGPoint(跨平台)
定义函数
NSMakePoint
CGPointMake
3、NSSize/CGSize
成员:两个CGFloat/double型变量width和height
作用:用来表示UI元素的尺寸
定义方式
定义函数
NSMakeSize
CGSizeMake
4、NSRect/CGRect
成员:
CGPoint(Rect左上角点的位置)
CGSize
作用:表示屏幕上的一块区域
定义方式
定义函数
NSMakeRect
CGRectMake
5、将结构体转换为字符串的函数
NSStringFromRange
NSStringFromPoint
NSStringFromSize
NSStringFromRect
举例:
6、常量
CGPointZero指坐标原点
CGSizeZero
CGRectZero
使用CG开头的常量和函数要添加CoreGraphics框架
7、其他用法
CGPointEqualToPoint 比较两个点释放相同,另有相同的Size和Rect函数
CGRectContainsPoint 判断举行是否包含某个点
三、Foundation常用类
1、NSString字符串
字符串创建
对象方法
1.最普通简单的字符串
NSString *s1 = @"4654651";
2.带参数的组合字符串
[[NSString alloc] initWithFormat:@"age is %d", 10];
3.C字符串转换为OC字符串
[[NSString alloc] initWithUTF8String:"Jack"];
4.从文件读取字符串
NSString *s4 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil ];
// NSUTF8StringEncoding 用到中文就可以用这种编码
5.从本地或者网络读取资源转换成字符串
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"]
NSString *s5 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil ];
// URL: 资源路径
// 协议头://路径 Http://->网络 file://->本地 ftp://->
类方法(常用)
NSString *s6 = [NSString stringWithFormat:@"5465"];
NSString *s7 = [NSString stringWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil ];
// 创建本地文件的URL
NSURL *url1 = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
// 最普通的创建URL的类方法
NSURL *url2 = [NSURL URLWithString:@"file:///Users/apple/Desktop/1.txt"];
NSString *s8 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil ];
字符串的导出
[@"Jack\nJack" writeToFile:@"/Users/apple/Desktop/1.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil ];
// atomically:原子性:若写入新文件时中断,YES则文件不会创建,NO时会创建
//另有类似的writeToURL方法
子类NSMutableString可变字符串(继承自NSString,拥有NSString的方法)
字符串拼接
appendString
appendFormat
删除字符串中某个范围内的字符
// 删除s1中的is方法1
[s1 deleteCharactersInRange:NSMakeRange(4, 2)];
// 删除s1中的is方法2
NSRange range = [s1 rangeOfString:@"is"]; // 获取is的范围
[s1 deleteCharactersInRange:range];
2、NSArray数组
数组的创建
OC数组只能存放OC对象,不能存放非OC对象类型,如int、struct、enum等
不能存放nil值
// 创建数组
NSArray *array = [NSArray array]; // 这个array永远是空数组
NSArray *arr1 = [NSArray arrayWithObject:@"Jack"];
NSArray *arr2 = [NSArray arrayWithObject:@"Jack", @"Rose", nil]; // nil是数组元素结束的标记
NSArray *arr3 = @[@"Jack", @"Rose", @"dack"]; // 快速创建一个NSArray对象,尽量用这种
获取数组元素个数
// 获取数组元素个数
[arr2 count];
arr2.count; // count是获取数组元素个数的方法
访问数组中的元素
// 访问数组中的元素
[arr2 objectAtIndex:1]; // 最原始的方法
arr2[0];// OC编译器特性也支持此格式
遍历数组中的元素
// 遍历数组中的元素
NSArray *arr4 = @[@"Jack", @"Rose", @"dack", @"bitch", @"fuck", nil];
// 最普通的写法
for(int i = 0 ; i < arr4.count ; i++)
{
NSLog(@"%@", arr4[i]);
}
// 快速遍历,id obj代表数组中的每一个元素
for(id obj in arr4)
{
// 找出obj元素在数组中的位置
NSUInteger i = [arr4 indexOfObject:obj];
NSLog(@"%ld - %@", i, obj);
}
// block遍历
[arr4 enumerateObjectsUsingBlock:
// 每遍历到一个元素,就调用一次block
// 并且当前元素和索引位置当做参数传给block
^(id obj, NSUInteger idx, BOOL *stop){
NSLog(@"%ld - %@", idx, obj);
// 停止遍历
if(idx == 1)
{
*stop = YES;
}
}];
子类NSMutableArray可变数组
NSMutableArray *marray = [NSMutableArray array];
NSMutableArray *marray1 = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
// OC数组不能放基本数据类型、结构体、枚举等,也不可以是nil
// addObject:向可变数组中添加元素
[marray addObject:[[Person alloc] init]];
[marray addObject:@"Jack"];
/* 错误写法
[marray addObject:10];
[marray addObject:nil];
*/
// 移除所有元素
[marray removeAllObjects];
// 移除指定元素
[marray1 removeObject:@"Jack"];
// 按索引移除指定元素
[marray removeObjectAtIndex:2];
// 错误写法
// @[] 只创建不可变数组NSArray
NSMutableArray *array = @[@"jack", @"rose"];
[array addObject:@"jim"];
3、NSSet
创建方法
set 创建,没有元素
setWithObject 单个元素
setWithObjects 多个元素
访问元素
anyObject 随机,不确定是哪个
元素个数
count
如:
NSSet *s = [NSSet set];
NSSet *s2 = [NSSet setWithObjects:@"jack", @"rose", @"scort", @"sam", nil]; // 初始化set
NSString *str = [s2 anyObject]; // 访问set中的元素
NSLog(@"%@", str);
NSLog(@"%ld", s2.count);
子类NSMutableSet
set 创建
addObject 增加元素
removeObject 移除指定元素元素
NSMutableSet *s = [NSMutableSet set];
[s addObject:@"hack"]; // 添加元素
[s removeObject:@"jack"]; // 移除元素
NSSet与NSArray的异同点
1、共同点
* 都是集合,都能存放多个OC对象
* 只能存放OC对象,不能存放非OC对象类型,如基本数据类型、结构体struct、枚举enum
* 都有一个可变的子类,本身是不可变的
2、不同点
* NSArray是有顺序的,NSSet没有顺序
4、NSDictionary字典
创建
NSDictionary *dict4 = @{@"name" : @"jack", @"address" : @"Beijing", @"QQ" : @"djaf"};
// 此处是利用了编译器特性,将键值对逐个写入,但是存储时是无序的
// 创建只有一个键值对的字典
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"]
// 根据键值数组创建多个键值对的字典
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"Beijing"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
// 创建多个键值对的字典
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
@"jack", @"name",
@"Beijing", @"address",
@"45123", @"QQ", nil];
访问键值对
// 根据键获取对应值
id obj = [dict ObjectForKey:@"name"];
// 编译器特性快速获取键值
id obj = dict[@"name"];
统计键值对数
NSLog(@"%ld", dict.count); // count返回键值对数
字典的遍历
// 字典不允许有相同的key,但允许有相同的value
// 字典是无序的
// 遍历
NSDictionary *dict4 = @{@"name" : @"jack", @"address" : @"Beijing", @"QQ" : @"djaf"};
// 用for循环遍历
NSArray *keys = [dict4 allKeys]; // 取key至一个数组中,但key无序
for(int i=0; i<dict.count; i++)
{
NSString *key = keys[i];
NSString *object = dict[key];
NSLog(@"%@ = %@", key, object);
}
// 用block遍历 (提示的时候双击或者回车即可)
[dict4 enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop){
NSLog(@"%@ = %@", key, obj);
*stop = YES; // 遍历一次即退出
}];
子类NSMutableDictionary
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// 添加键值对,没有顺序之分的
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"Beijing" forKey:@"address"];
[dict setObject:@"rose" forKey:@"name"]; // 这里会把前面对应的值覆盖掉
[dict removeObjectForKey:@"name"]; // 根据键移除键值对
NSLog(@"%@", dict);
/* 错误写法 @{key : value,...}返回值是不可变字典
NSMutableDictionary *dict = @{@"name" : @"jack", @"address" : @"Beijing", @"QQ" : @"djaf"};
[dict setObject:@"rose" forKey:@"name"];
*/
5、NSNumber
作用:将基本数据类型包装为OC对象
创建方法:
@+数字(编译器特性)
// 编译器特性 @+number 创建NSNumber类型对象
NSNumber *nn = @30;
int age = 100;
@(age); // 将age包装成NSNumber对象
// 将各种基本数据类型包装成NSNumber对象
@10.5;
@YES
@'a' // NSNumber对象
@"a" // NSString对象
其他
// NSNumber的创建
NSNumber *num = [NSNumber numberWithInt:10]
NSNumber *n = [NSNumber numberWithDouble:10.5];
基本数据类型与NSString类型转换
// 基本数据类型与NSString类型转换
int a = 20;
NSString *str = [NSString stringWithFormat:"%d", a];
int e = [str intValue];
基本数据类型与NSNumber类型转换
// 基本数据类型与NSNumber类型转换
NSNumber *n = [NSNumber numberWithDouble:10.5];
double d = [n doubleValue];
6、NSValue
作用:将非OC类型包装成OC对象
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue
// NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue
CGPoint p = CGPointMake(10, 10);
// 将结构体包装为Value对象
NSValue *value = [NSValue valueWithPoint:p];
// 解包装为NSPoint/CGPoint类型
[value pointValue];
7、NSDate
作用: 对时间进行操作
方法
创建方法
// 创建一个时间对象
NSDate *date = [NSDate date];
其他方法
// 创建一个时间对象
NSDate *date = [NSDate date];
// 打印的时间是0时区格林尼治时间(北京-东八区)
NSLog(@"%@", date);
// 比date晚5秒的时间
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
// 从1970年开始走过的秒数
NSTimeInterval seconds = [date2 timeIntervalSince1970];
时间格式化,需要调用NSDateFormatter类
NSDate不能直接在屏幕显示,必须转换成NSString
NSDate->NSString
// 时间格式化
NSDate *date = [NSDate date];
// 显示Date必须先转换成字符串
// 日期格式化类
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// y 年 M 月 d 日 m 分 s 秒 H (24)时 h(12)时
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *str = [formatter stringFromDate:date];
NSString->NSDate
// 字符串时间转换为NSDate型
NSString *time = @"2011/09/10 18:16";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm";
NSDate *date3 = [formatter dateFromString:time];