###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; }