您的位置:首页 > 职场人生

黑马程序员-Foundation架构笔记

2016-01-10 09:30 417 查看
------<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]; /
bac9
/ 删除第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的初始化,快速初始化,可变子类,遍历数组,字典,还有数组顺序是否可变等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息