OC語言自學《十二》---- OC(Foundation框架部分知識總結)

###NSRangejava

表示一個範圍 主要用來操做字符串數組

代碼示例: <!-- lang: cpp -->app

//NSRange是一個結構體,其中location是一個以0爲開始的index,length是表示對象的長度。他們都是NSUInteger類型。
//定義以下
typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;    

//NSUInteger的本質時unsigned long類型
typedef unsigned long NSUInteger;

NSRange range = NSMakeRange(2,4);       //須要記住的建立範圍方式

NSString *str = @"i love oc";    
//NSString的對象方法rangeOfString查找某個字符串在str中的範圍
NSRange range1 = [str rangeOfString:@"ve o"];    //ve o在str字符串中的範圍 4 4
//若是找不到,location=NSNoFound=-1,length=0,
NSRange range2 = [str rangeOfString:@"java"];        
NSLog(@"\nlocation=%ld,length=%ld",range1.location,range1.length);

###CGPoint、NSPointatom

經過設置x座標和y座標來設置某個點 IOS設備的x和y從左上角開始,y值往下面增長,x值往右面增長url

代碼示例:code

<!-- lang: cpp -->

//NSPoint和CGPoint相等
CGPoint p1 = NSMakePoint(30, 40);
CGPoint p2 = CGPointMake(10, 10);   //開發中這個最經常使用

//CGPointZero表明x和y座標都爲0-----(0,0)
CGPoint p3 = CGPointZero;

//NSPoint的本質是CGPoint
typedef CGPoint NSPoint;

//CGPoint的本質
struct CGPoint {
      CGFloat x;
      CGFloat y;
};
typedef struct CGPoint CGPoint;

//比較兩個點是否相同(x、y)
BOOL result1 = CGPointEqualToPoint(CGPointZero, CGPointMake(1, 0));     //0

###CGSize、NSSizecomponent

表示一個矩形尺寸,寬高orm

代碼示例對象

<!-- lang: cpp -->

//建立了兩個矩形,s1的寬是100,高是60
CGSize s1 = CGSizeMake(100, 60);
NSSize s2 = NSMakeSize(100, 50);
CGSize s3 = CGSizeZero;

//CGSize的本質
struct CGSize {
    CGFloat width;
    CGFloat height;
};
typedef struct CGSize CGSize;

//比較兩個尺寸是否相同
BOOL result2 = CGSizeEqualToSize(CGSizeZero, CGSizeMake(0, 0)); //1

###CGRect、NSRect索引

CGRect包含了一個按鈕在手機屏幕上的位置,和按鈕自己的寬和高

代碼示例:

<!-- lang: cpp -->

//Rect的本質    
struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;


NSPoint p1 = CGPointMake(10, 10);   
CGSize s3 = NSMakeSize(200, 60);
//建立了一個Rect
CGRect c1 = {p1, s1};    


//將結構體轉換成字符串
NSString *str = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s1);
NSString *str3 = NSStringFromRect(r1);

//而後打印
NSLog(@"Point=%@,NSSize=%@,NSRect=%@",str,str2,str3);

//多種Rect的建立方式
CGRect c2 = {CGPointZero,CGSizeMake(100, 90)};
CGRect c3 = {CGPointMake(10, 10),CGSizeZero};
CGRect c4 = {{10,20},{200,100}};

//比較兩個Rect是否相同
BOOL result3 = CGRectEqualToRect(c2, c3);

//判斷一個矩形中是否包含某個點,包含返回YES(1),不包含返回NO(0)
BOOL result = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(100, 70));    //YES(1)

//將結構體轉換成字符串,方便打印
NSString *str = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s1);
NSString *str3 = NSStringFromRect(r1);
NSLog(@"Point=%@,NSSize=%@,NSRect=%@",str,str2,str3);

###NSString(不可變字符串) ####字符串建立(initWithFormat)

<!-- lang: cpp -->

NSString *str1 = @"Something string..";

NSString *str3 = [[NSString alloc]initWithFormat:@"age is %d",10];

####OC字符串和C字符串之間的轉換

<!-- lang: cpp -->

// C字符串 -》 OC字符串
NSString *str4 = [[NSString alloc] initWithUTF8String:"jack"];

// OC字符串 -》 C字符串
const char *str5= [str4 UTF8String];

####從文件或URL建立字符串

<!-- lang: cpp -->

//URL:資源路徑
//協議頭://路徑
//file://
//ftp://
//http://weibo.com/a.jpg
//推薦用URL
//也能夠抓取網頁的內容,好比www.baidu.com首頁
//建立一個URL,只要是URL就必須指定好協議頭
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/guankunluo/Desktop/1.txt"];

 //從文件讀取,並建立字符串str6
NSString *s = @"/Users/guankunluo/Desktop/1.txt";
NSString *str6 = [[NSString alloc]initWithContentsOfFile:s encoding:NSUTF8StringEncoding error:nil];

//將字符串轉換爲file協議的地址
NSURL *url2 = [NSURL fileURLWithPath:@"/Users/guankunluo/Desktop/1.txt"];
//從URL讀取內容,並建立新的字符串str7
NSString *str7 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

####把字符串寫入到文件(- writeToFile、 - writeToURL)

<!-- lang: cpp -->

//把字符串寫入到文件
NSString *path = @"/Users/guankunluo/Desktop/2.txt";
//加入\n來表明換行
[@"Jack \n Jack" writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

//把字符串寫入到URL
NSURL *url = [NSURL URLWithString:@"file:///Users/guankunluo/Desktop/2.txt"];
[@"lalalalala" writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

###NSMutableString(可變字符串) ####建立一個可變的字符串

<!-- lang: cpp -->

//建立一個NSMutableString,可變
NSMutableString *str1 =[NSMutableString stringWithFormat:@"age is %d",10];

####拼接字符串

<!-- lang: cpp -->

//拼接內容到str1的結尾處,無返回值
[str1 appendString:@" 11 12"];

####刪除字符串

<!-- lang: cpp -->

//根據範圍把字符串中is刪除,可是str1的字符串改變,範圍也就改變了,因此很差
//[str1 deleteCharactersInRange:NSMakeRange(4,2)];

//應該根據rangeOfString方法先找出is的範圍
NSRange range = [str1 rangeOfString:@"is"];

//而後在把取得的範圍傳入刪除字符串方法的參數中,這樣之後再改變也會隨之改變範圍
[str1 deleteCharactersInRange:range];

###NSArray(有序不可變集合)

集合只能存放OC對象,不能存放基本類型

####建立NSArray

<!-- lang: cpp -->

//集合只能存放OC對象,不能存放基本類型
//建立只有1個集合,並設置一個元素
NSArray *array01 = [NSArray arrayWithObject:@"abc"];

//nil時集合元素的結束標記,不能刪除
//集合中也不能定義nil元素
//NSArray *array02 = [NSArray arrayWithObjects:@"abc",@"def", nil];     //不推薦
NSArray *array02 = @[@"abc",@"def"];    //推薦

####獲取NSArray的長度

<!-- lang: cpp -->

//[array02 count];

//array02.count 返回的是unsigned long
NSLog(@"%ld",array02.count);

####訪問集合

<!-- lang: cpp -->

NSLog(@"%@",[array02 objectAtIndex:1]); //不推薦
NSLog(@"%@",array02[1]);    //推薦

###NSMutableArray(有序可變集合) ####建立可變集合

<!-- lang: cpp -->

//建立一個可變的空集合
NSMutableArray *array = [NSMutableArray array];    

//初始化可變集合時,添加元素
NSMutableArray *array2 = [NSMutableArray arrayWithObjects: @"sss", @"aaa", @"bbb", nil];

//錯誤,@[]返回的時NSArray,因此不能用@[]建立可變集合NSMutableArray
//NSMutableArray *array3 = @[@"dd",@"dsd",@"dsd"];

####添加元素

<!-- lang: cpp -->

//給可變集合添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];

####刪除元素

<!-- lang: cpp -->

//刪除全部元素
[array2 removeAllObjects];

//刪除指定元素
[array2 removeObject:@"aaa"];

//刪除指定索引的元素
[array2 removeObjectAtIndex:1];

//刪除最後一個元素
[array2 removeLastObject];

###NSSet和NSMutableSet(無序不可變集合和可變集合)

NSSet 和 NSArray的對比 共同點: 1.都是集合,都能存放多個OC對象 2.只能存放OC對象,不能存放非OC對象類型(基本數據類型:int、float等、結構體、枚舉) 3.都有一個可變的子類,自己不可變

不一樣點: 1.NSArray有順序,NSSet無順序

####NSSet

<!-- lang: cpp -->

//錯誤,沒有意義,建立了一個空的set集合,並且Set是不可變的
//NSSet *s = [NSSet set];

NSSet *s = [NSSet setWithObjects: @"aaa", @"bbb", @"ccc", @"ddd", nil];

//因爲NSSet是無序的,因此只能隨機取出元素
//隨機取出元素
NSString *str = [s anyObject];

####NSMutableSet

<!-- lang: cpp -->

NSMutableSet  *s = [NSMutableSet set];

//添加元素
[s addObject:@"hack"];
[s addObject:@"haha"];

//刪除全部元素
[s removeAllObjects];

//刪除指定元素
[s removeObject:@"haha"];

###NSDictionary和NSMutableDictionary(可變和不可變的字典集合)

字典:至關於java中的map 字典是無序的 key----》value 索引----》文字內容 Dictionary中存儲的是鍵值對 Dictionary中的key不能重複,value能夠重複

####NSDictionary(不可變字典集合)

<!-- lang: cpp -->

//NSDictionary---不可變的字典、無序的
//建立了一個字典,可是隻存儲了一個鍵值對
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"luoguankun" forKey:@"name"];

//經過key獲取value
NSString *name =  [dict objectForKey:@"name"];
NSLog(@"%@",name);  //luoguankun
//推薦這樣訪問字典中的value
id obj = dict[@"name"];

//經過傳入2個不可變數組NSArray來初始化Dictionary字典集合
NSArray *key = @[@"name",@"address"];
NSArray *value = @[@"羅冠坤",@"北京"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:value forKeys:key];
//若是傳入的key沒有找到,就返回null,不報錯
NSLog(@"%@",[dict2 objectForKey:@"address"]); //北京

//下面的寫法可讀性不好
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:
                       @"luoguankun",@"name",
                       @"北京",@"address",nil];

//推薦使用這種方式初始化建立字典
NSDictionary *dict4 = @{@"name": @"luoguankun",@"address": @"北京"};

//返回鍵值對的個數,不是key+value的個數
int count = dict4.count;

####NSMutableDictionary(可變字典集合)

<!-- lang: cpp -->

//錯誤!@{}返回不可變的Dictionary
//NSMutableDictionary *dict = @{@"name",@"luoguankun"};

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

//添加鍵值對
[dict setObject:@"luoguankun" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];

//當設置了重複的key時,會覆蓋之前的,因此dictionary中的key是惟一的,value能夠重複
[dict setObject:@"luo" forKey:@"name"];

NSLog(@"%@",dict[@"name"]); //luo

//刪除某個key所指向的鍵值對
[dict removeObjectForKey:@"address"];

####Dictionary字典集合的遍歷

<!-- lang: cpp -->

 NSDictionary *dict = @{@"name": @"luoguankun",@"address":@"北京"};

//經過for循環遍歷NSDictionary,不推薦
NSArray *keys = [dict allKeys];
for (int i = 0; i < keys.count ; i++) {
    NSString *value = [dict objectForKey:keys[i]];
    NSLog(@"%@---%@",keys[i],value);
}

//推薦使用這種遍歷方式,經過block遍歷集合
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    NSLog(@"%@-%@",key,obj);
    
    //打印一次就中止
    *stop = YES;
}];

###遍歷集合 ####方式一(for)

<!-- lang: cpp -->

//NSArray快速遍歷
NSArray *array1 = @[@"a",@"b",@"c",@"d",@"f",@"g"];

//普通的for循環
for(int i = 0; i < array.count; i++)
{
    NSLog(@"%@",array[i]);
}

####方式二(for in)

<!-- lang: cpp -->

//很像java中的foreach
//id obj 表明着集合中的每個元素
for(id obj in array1)
{
    //找出obj元素在數組中的位置
    unsigned long i = [array1 indexOfObject:obj];

    NSLog(@"%ld=%@",i,obj);
}

####方式三(block)推薦

<!-- lang: cpp -->

// 每遍歷到一個元素,就會調用一次block
// 而且把當前元素和索引位置當作參數傳給block
// stop的做用至關於break,終止循環
// 設置爲YES,就中止循環
//obj表明當前元素對象
//idx表明元素下標
[array1 enumerateObjectsUsingBlock:
    ^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%ld = %@", idx,obj);
        
        if(idx == 2)
        {
            *stop = YES;
        }
    }
];

//block遍歷集合的本質
void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *step)
{
    NSLog(@"%ld - %@", idx, obj);
    
    if (idx == 2) {
        //中止遍歷
        *step = YES;
    }
};


for (int i = 0; i < array1.count; i++) {
    
    //用來標記是否須要中止遍歷
    BOOL isStop = NO;
    
    //取出元素
    id obj = array1[i];
    
    myblock(obj, i, &isStop);
    
    if (isStop) {
        break;
    }
}

###練習—計算代碼行數

<!-- lang: cpp -->

#import <Foundation/Foundation.h>

NSUInteger codeLineCount(NSString *);

/*
 考察NSString、NSArray的使用
 NSFileManager
 */
int main(int argc, const char * argv[])
{

    /*
     分割字符串
     NSString *str = @"jack-rose- jim-jake";
     NSArray *array = [str componentsSeparatedByString:@"-"];
     [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
     NSLog(@"%@",obj);
     }];
     */
  
    
    NSUInteger count = codeLineCount(@"/Users/guankunluo/Documents/C_Files/");
    NSLog(@"該路徑下全部文件共計:%ld行",count);

    return 0;
}


/*
 path:文件全路徑
 返回值:代碼行數
 */
NSUInteger codeLineCount(NSString *filePath)
{
 
    //1.獲取文件管理者,它是單例類
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    //2.判斷path是文件夾仍是文件路徑,返回BOOL
    BOOL dir = NO;  //用來標記是否爲文件夾
    //這個路徑是否存在,等因而返回了兩個值,一個是方法返回值,一個是傳進去的dir
    BOOL exist = [mgr fileExistsAtPath:filePath isDirectory:&dir];   //這個方法會改變dir,由於傳得是地址
    
    //3.若是路徑不存在,就直接返回0
    if (!exist) {
        NSLog(@"路徑不存在");
        return 0;
    }
    
    int count = 0;

    //說明路徑存在
    //判斷是一個文件夾,仍是是一個文件
    if (dir) {
        
        //NSLog(@"是一個文件夾");
        
        //裝着當前文件夾下的全部內容(文件夾、文件)
        NSArray *array = [mgr contentsOfDirectoryAtPath:filePath error:nil];
        //打印出文件夾中的文件列表
        //NSLog(@"%@",array);

        
        //根據文件列表,拼接出全路徑
        for (NSString *filename in array) {
            NSString *fullPath = [NSString stringWithFormat:@"%@%@",filePath,filename];
            count += codeLineCount(fullPath);
        }
        
    } else {
        
        //NSLog(@"是一個文件");
        
        //4.獲取文件的拓展名,而且轉換成小寫
        NSString *extension = [[filePath pathExtension] lowercaseString];
        if (![extension isEqualToString:@"h"]
            && ![extension isEqualToString:@"m"]
            && ![extension isEqualToString:@"c"])
        {
            //表明文件拓展名,不是m,也不是h,也不是c
            return 0;
        }
        
        //加載文件內容
        NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
        
        //按指定字符串,分割字符串,返回集合
        NSArray *array = [content componentsSeparatedByString:@"\n"];

        //控制輸出的內容,把根路徑換掉
        NSRange range = [filePath rangeOfString:@"/Users/guankunluo/Documents/C_Files/"];
        //替換字符串
        NSString *str = [filePath stringByReplacingCharactersInRange:range withString:@""];
            
        NSLog(@"%@-%ld",str,array.count);

        return array.count;
    }
    return count;
}
相關文章
相關標籤/搜索