------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
Foundation框架的常用数据结构:
结构体:
1.NSRange()
1.结构体
NSRange(location,lenght)// 计算范围的方法
NSPoint()/CGPoint // 获得一个点
NSSize / CGSize //获得长度和高度
NSRect / CGRect(double x,double y,double width,double height) // 画一个矩形区域,并给出顶点坐标
1>NSRange()//CGPoint,CGSize,CGRect;调用的方法都很相似,在此只写一些
NSString *string = @"huang huanen";
// NSRange range = {10,2};
NSRange range = NSMakeRange(10, 2); // 在字符串中找固定下标为9,范围为2的字符串
NSRange rs = [string rangeOfString:@"en"]; // 在string的字符串中找en,并返回该字符串的范围,这个方法比较常 用,可以动态获取某字符串的范围
NSLog(@"这是Johnson的代码:%ld - %ld",rs.location,rs.length);
bool b = CGPointEqualToPoint(CGPointMake(10, 16), CGPointMake(10, 10)); // 比较两个点是否一样
bool result = CGRectContainsPoint(CGRectMake(10, 20, 30, 40), CGPointMake(20, 30)); // 矩形是否包含一个点
NSRect r1 = CGRectMake(10, 10, 10, 10);
NSString *s = NSStringFromRect(r1); // 如何将结构体转成字符串
NSString *s1 = NSStringFromRange(NSMakeRange(10, 10)); //依次类推,结构体转成字符串还有CGPoint, CGSize,方法只需改变From后面的就可以。
2.总结NSString
1、创建字符串(类方法创建,也有对应的实例变量创建)
1>NSString *str = @"huaneghuanan"; // 快速创建一个不可变的字符串
2>NSString *str2 = [NSString stringWithFormat:@"mystring %@ , my number= %d",@"johnosn",a];
3>NSString *str3 = [NSString stringWithString:@"hahhahahh"]; // 这种方法Xcode会警告,已经不太实用
2、OC字符串和C字符串的相互转化
1>NSString *str4 = [NSString stringWithUTF8String:"johnosn"]; // 将C字符串转成OC字符串
2>const char *str5 = [str UTF8String]; // 将OC字符串转成C字符串
3、读文件
1> NSString *str6 = [NSString stringWithContentsOfFile:@"/Users/huanghuanen/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil]; // 根据文件路径打开文件,只读取文件
2> NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; // 先创建URL的路径
NSURL *url1 = [NSURL fileURLWithPath:@"文件路径"]; // 只对文件
NSString *str7 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; // URL可以进行所有文件的读取,只要知道路径就可以 格式:file:// 文件路径 ftp:// http://
4、写文件
1> NSString *str8 = @"johnson";
[str8 writeToFile:@"filepath..my.txt"] // 将str8写到路径为filepath下的my.txt;
2> NSURL *url = [NSURL URLWithString:@"file:///Users/huanghuanen/Desktop/hhe.c"];
[str8 writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil]; // 写文件的第2种方式
3> // NSMutableString是可变字符串,是NSString的子类,拥有NSString的所有方法。
NSMutableString *str1 = [NSMutableString stringWithFormat:@"my string is %@",@"johnson"];
[str1 appendString:@"2016"]; // 在str1的内容上拼接字符串2016
NSRange range = [str1 rangeOfString:@"is"]; // 字符串str1中找出is的范围
[str1 deleteCharactersInRange:range]; // 删除str1的第一个is
NSString *str2 = [NSString stringWithFormat:@"my string is %@",@"hhe"];
NSString *str3 = [str2 stringByAppendingString:@"2016"];// str2是不可变字符串,只能被拷贝一份再进行拼接,str2本身实际上没变;
3. 数组遍历// NSArray 的数组元素必须是OC对象
NSArray *array1 = [NSArray arrayWithObjects:@"rose",@"johnson", nil]; // OC数组不能有空元素nil
NSArray *array2 = [array1 objectAtIndex:0]; // 获取数组的第一个元素
NSArray *array4 = @[@"rose",@"johnson"]; // 快速创建一个NSArray的数组
NSArray *array3 = array1[0]; // 编译器特性,获取数组的第一个元素,跟C语言一样
NSLog(@"这是Johnson的代码%@",array1); // 打印字符串的所有元素
NSLog(@"%ld",array1.count); // 打印字符串的元素个数
NSLog(@"%@",array2); // 打印字符串的第一个元素
NSLog(@"%@",array3); // 打印字符串的第一个元素
NSLog(@"%@",array4);
NSArray *array1 = @[@"johnson",@"hhe2010",@"hheheh"];
/* 方法1:与C语言相似*/
for ( int i = 0 ; i < array1.count ; i++) {
NSLog(@"%@",array1[i]);
}
/*方法2:快速遍历数组*/
for (id obj in array1 ) {
NSUInteger i = [array1 indexOfObject:obj]; // 获取数组的下标
NSLog(@"%ld-%@",i,obj);
}
/*方法3:用block遍历数组,每当遍历一次元素,就调用一次block*/
[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%ld-%@",idx,obj);
if ( idx == 1) { // 如果下标等于1,则退出循环。
*stop = YES;
}
} ];
// 可变数组的基本使用
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"johnson",@"jim", nil]; // 注意,如果不可变的数组赋值给了可变数组,运行时会出错。
[array addObject:@"hello"]; // 给数组添加一个元素
[array removeObject:@"jim"]; // 删除某个特定的元素
[array removeAllObjects]; // 删除所有元素
[array removeObjectAtIndex:0]; // 删除第1个元素
// NSString、NSArray、filemanager的综合练习
// main.m
// 04-计算代码行数
// Created by 黄焕恩 on 16/1/7.
// Copyright © 2016年 黄焕恩. All rights reserved.
//
#import <Foundation/Foundation.h>
NSUInteger codeLineCount(NSString *filepath)
{
// 1.获取文件管理者
NSFileManager *msr = [NSFileManager defaultManager];
// 2.判断filepath是文件夹路径还是文件路径
BOOL dir = NO; // b标志位,判断是不是文件或者文件夹
BOOL exist = [msr fileExistsAtPath:filepath isDirectory:&dir]; // 传入的是地址,所以可以改变dir的值
if ( !exist ) { // 3.先判断传入的路径是否存在,如果不存在则退出
return 0;
}
if(dir) // 若dir==YES,则是文件夹,否则就是文件
{
NSUInteger count = 0;
NSArray *array1 = [msr contentsOfDirectoryAtPath:filepath error:nil]; // 装着当前文件夹下面的所有内容(包括文件夹和文件)
for (NSString *filename in array1) { // 遍历当前文件夹下所有的文件
NSString *fullpath = [NSString stringWithFormat:@"%@/%@",filepath,filename];
count += codeLineCount(fullpath); // 利用递归,找出文件夹里面的文件夹,直到找到文件为止
}
return count;
}
else
{
// 4.判断文件的拓展名
NSString *extension = [[filepath pathExtension] lowercaseString]; //(忽略拓展名的大小写)
if( ![extension isEqualToString:@"h"] && ![extension isEqualToString:@"m"] && ![extension isEqualToString:@“c”])// 要计算的是.m 或点h.或.c的文件。
{
return 0;
}
NSString *str = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:nil]; // 通过传入的路径加载文件
// NSLog(@"%@",str);
NSArray *array = [str componentsSeparatedByString:@"\n"]; // 将文件用\n进行分隔,因为每行代码都是用\n来换行的。
NSRange range = [filepath rangeOfString:@"/Users/huanghuanen/Desktop/IOS_Study/"];
NSString *str1 = [filepath stringByReplacingCharactersInRange:range withString:@""]; // 将文件路径除去前面部分。
NSLog(@"%@-%ld",str1,array.count);
return array.count;
}
}
int main() {
NSUInteger count = codeLineCount(@"/Users/huanghuanen/Desktop/IOS_Study");
NSLog(@"%ld",count);
return 0;
}
5. NSSet 和 NSMutableSet的基本用法
NSSet *set = [NSSet setWithObjects:@"haha",@"johana",@"ddaeee", nil]; // NSSet的初始化
NSString *set1 = [set anyObject]; //随机打印一个字符串
NSMutableSet *muset =[NSMutableSet set]; // 可变的set
[muset addObject:@"huangen"];
NSLog(@"%@",set1);
/* NSSet 和 NSArray 的对比
1>共同点
*都是集合,都能存放多个OC对象
*只能存放OC对象,不能存放非OC对象,例如基本数据类型:int,char ,float,double,结构体,枚举
*本身都不可变,都有一个可变的子类
2>不同点
NSSArray是有顺序的,NSSet是随机的。
7.Dictionary的使用
*/
以下这部分代码都是字典的初始化和方法的调用*/
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"johnson" forKey:@"name"];
NSString *string = [dict objectForKey:@"name"];
NSLog(@"%@",string);
NSArray *array = @[@"johnson",@"廖世成",@"小康"];
NSArray *key = @[@"name1",@"name2",@"name3"];
NSDictionary *dict1 = [NSDictionary dictionaryWithObjects:array forKeys:key]; // 字典的key可以传数组
NSArray *array2 = [dict1 objectsForKeys:key notFoundMarker:@"123"];// 传入key关键字,如果找不到,返回@“123”
NSLog(@"%@",array2);
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"johnson1",@"name1", nil]; // 该方法一般不用
NSLog(@"%@",[dict2 objectForKey:@"name1"]);
NSDictionary *dict3 = @{@"j":@"jjjjjj",@"h":@"hhhhhhh"}; // 编译器特性,键值对:先key,再value,经常使用该方法
NSLog(@"%@",[dict3 objectForKey:@"j"]); // 调用方法
NSLog(@"%@",dict3[@"j"]); // 调用像数组,常用
2> 遍历字典 ,打印出来是随机的。第一种遍历方法用block
NSDictionary *dictionary = @{@"d":@"ddddd",@"f":@"fffff",@"g":@"gggg",@"h":@"hhhhh"};
[dictionary enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { // 该遍历字典的方法常用,而且很方便使用
NSLog(@"%@,%@",key,obj);
}];
3>遍历的第二种方法
NSArray *keys = [dictionary allKeys]; // 取出字典的所有key存入数组
for (int i = 0; i<dictionary.count; i++)
{
NSString *key = keys[i]; // 将数组里面的key一个个拿出来
NSString *object = dictionary[key]; // 传入键值,找到value,遍历完毕
NSLog(@"%@ = %@", key, object);
}
4>数组字典嵌套使用//
NSArray *persons = @[
@{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]},
@{@"name" : @"rose", @"qq" : @"767567"},
@{@"name" : @"jim", @"qq" : @"423423"},
@{@"name" : @"jake", @"qq" : @"123123213"} ];
NSString *bookName = persons[0][@"books"][1]; // 数组存有字典,使用跟C的数组很相似,person[0]是字典,是数组下标为0的元素,取出关键字key-@books,而books又是一个数组,books[1]是数组的第一个元素,所以Bookname是@“5分钟突破android编程”
NSLog(@"%@", bookName);
总结:
Foundation为我们提供了很多系统自带的常用方法,而他们的使用都有一些规律性可循,无论是从OC的结构体到到集合类,同类方法在调用的方法中,都是类名+方法名。学习OC结构体,需要掌握最常用的NSRange,NSSize/CGSize,NSPoint/CGPoint,NSRect/CGRect的基本用法和参数。集中常用的方法包括:比较两个点是否相同(NSPointequaltoPoint,或者比较矩形区别是否包含某点,动态获得某字符串的位置,将结构体转成字符串。 在集合类中,NSString,NSArray,NSSet,NSDictionary的初始化,快速初始化,可变子类,遍历数组,字典,还有数组顺序是否可变等。