黑马程序员-Foundation架构笔记

------<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的初始化,快速初始化,可变子类,遍历数组,字典,还有数组顺序是否可变等。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值