黑馬程序員——IOS基礎——Foundation框架——結構體、字符串、數組

------- android培訓java培訓、期待與您交流!

===========結構體===========

NSRange(location length)
 NSPoint/CGPoint
 NSSize/CGSize
 NSRect/CGRect

//
//  main.m
//  01-結構體
//
//  Created by CH on 14-4-11.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
/*
 NSRange(location length)
 NSPoint/CGPoint
 NSSize/CGSize
 NSRect/CGRect
 */

int main(int argc, const char * argv[])
{
    BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));//判斷兩個點是否相同
    //依此類推,CGRect CGSize都又類似的方法
    //CGSizeEqualToSize(CGSize size1, CGSize size2);
    //CGRectEqualToRect(CGRect rect1, CGRect rect2);
    
    BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(230, 70));//reck中是否包含piont
    
    NSLog(@"%d",b2);
    return 0;
}
CGRect myRect1(CGFloat x,CGFloat y,CGFloat width,CGFloat height){
    CGRect rect;
    rect.origin.x = x;
    rect.origin.y = y;
    rect.size.width =width;
    rect.size.height =height;
    return rect;
}
CGRect myRect2(CGPoint p,CGSize s){
    CGRect rect;
    rect.origin.x = p.x;
    rect.origin.y = p.y;
    rect.size.width = s.width;
    rect.size.height = s.height;
    return rect;
}
void rect(){
    //NSPoint==CGPoint==CGFloat==double
    /*
     struct CGPoint{
     CGFloat x;
     CGFloat y;
     };
     typedef struct CGPoint CGPoint;
     開發中用CGPoint
     */
    
    CGPoint p1 = NSMakePoint(10, 10);
    NSPoint p2 = CGPointMake(10, 10);//開發中最常用
    
    NSSize s1 = CGSizeMake(100, 50);
    NSSize s2 = NSMakeSize(100, 50);
    CGSize s3 = NSMakeSize(100, 30);
    
    CGRect r1 = CGRectMake(0, 0, 100, 40);
    CGRect r2 = {{0,0},{100,90}};
    CGRect r3 = {p1,s2};
    //CGPointZero == CGPointMake(0, 0);//表示原點
    //CGSizeZero;
    //CGRectZero;
    CGRect r4 = {CGPointZero,CGSizeMake(100, 60)};
    
    
    //將結構體轉成字符串
    NSString *str1 = NSStringFromPoint(p1);
    NSString *str2 = NSStringFromSize(s3);
    NSString *str3 = NSStringFromRect(r1);
    
    NSLog(@"\n%@\n,%@\n,%@",str1,str2,str3);


}
void range(){
    
    struct Date {
        int year;
        int month;
        int day;
    };
    struct Date d = {2011,3,12};
    struct Date d2 = {.month = 10, .year = 2013, .day = 23};
    
    // @"i love oc" love 的範圍
    NSRange r1 = {2,4};//不用
    NSRange r2 = {.location = 2, .length = 4};//不用
    NSRange r3 = NSMakeRange(2, 4);//掌握
    
    NSString *str = @"i love oc";
    //如果找不到,length=0,location=NSNotFound==-1
    NSRange range = [str rangeOfString:@"love"];//查找某個字符串在str中的範圍
    
    NSLog(@"location = %ld,length = %ld",range.location,range.length);

}

===========字符串===========

NSString 不可變字符串:不能刪除,增加

NSMutableString 可變字符串:可以修改

//
//  main.m
//  02-NSString
//
//  Created by CH on 14-4-11.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

/*
 NSString : 不可變字符串
 
 NSMutableString : 可變字符串
 */

int main()
{
    //可變字符串
    NSMutableString *s1 = [NSMutableString stringWithFormat:@"age is 20"];
    //拼接內容到s1到後面
    [s1 appendString:@"11,22"];//s1的值會變
    //獲取is的範圍
    NSRange range = [s1 rangeOfString:@"is"];
    [s1 deleteCharactersInRange:range];
    //[s1 deleteCharactersInRange:NSMakeRange(4,2)];一般不用
    
    //不可變字符串
    NSString *s2 = [NSMutableString stringWithFormat:@"age is 200"];
    NSString *s3 = [s2 stringByAppendingString:@"123"];//拼接完返回新的字符串,s2本身不會改變
    
    NSLog(@"\ns1 = %@,\ns2 = %@,\ns3 = %@",s1,s2,s3);
    
    return 0;
}

void stringExport(){
    //字符串的導出
    [@"jack \njack" writeToFile:@"/Users/ch/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    NSString *str = @"1231";
    NSURL *url = [NSURL fileURLWithPath:@"/Users/ch/Desktop/my2.txt"];
    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
void nSStringAll(){
    //字符串的一些用法和NSURL
    NSString *s1 = @"jack";
    
    NSString *s2 = [[NSString alloc] initWithString:@"jack"];//不用
    
    NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d",10];
    
    //C字符串 -->OC字符串
    NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];
    //OC字符串-->C字符串
    const char *cs = [s4 UTF8String];//const 可以不寫
    
    //NSUTF8StringEncoding 用到中文就可以用這種編碼
    NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/ch/Downloads/test2.txt" encoding:NSUTF8StringEncoding error:nil];
    
    
    
    //URL:資源路徑
    //協議頭://路徑
    //本地文件: file://
    //網絡ftp服務器:ftp://
    //http://weibo.com/a.png
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.feilv.com"];
    NSURL *url1 = [NSURL fileURLWithPath:@"/Users/ch/Downloads/test2.txt"];
    
    NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
    
    NSLog(@"s6:\n%@",s6);
    
    /*一般都會有一個類方法和對象方法配對,都是已對象名開頭
     [NSURl urlwithString:@""]
     [NSString stringWithFormat:@""];
     NSString stringwithContentsOfFile
     */
}

===========數組===========

NSArray:不可變數組

//
//  main.m
//  03-NSArray
//
//  Created by CH on 14-4-11.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>
/*
 NSArray : 不可變數組
 NSMutableArray : 可變數組
 */
int main()
{
    Person *p = [[Person alloc] init];
    NSArray *array = @[p,@"jack"];
    //遍歷方式一
    for(int i = 0; i<array.count;i++){
        NSLog(@"%@",array[i]);
    }
    //遍歷方式二
    for(id obj in array){
//      NSUInteger i =[array indexOfObject:obj];//當前第幾次
        NSLOg(@"%@",obj);
    }
    //遍歷方式三
    [array enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){
        //idx表示索引位置,obj表示對象,stop是用來停止遍歷的
        NSLog(@"%ld - %@",idx,obj);
        if(idx==1){
            *stop = YES;//停止了idx爲1之後的對象
        }
    }];
    //遍歷方法三原理:
    /*void ^(myblock)(id,NSUInteger,BOOL *)=^(id obj,NSUInteger idx,BOOL *stop){
        NSLog(@"%ld - %@",idx,obj);
        if(idx==1){
            *stop = YES;
        }
    };
    for(int i = 0;i<array.count;i++){
        //用來標記是否需要停止遍歷
        BOOL isStop = NO;
        //取出元素
        id obj = array[i];
        myblock(obj, i, &isStop);//傳遞地址,才能改變值
        if(isStop){
            break;
        }
    }
    */
    return 0;
}
void baseuse(){
    //oc數組只能存放oc對象,不能存放非oc對象類型,比如int,struct,enum等
    
    /*
     數組的創建
     */
    NSArray *array = [NSArray array];//這個array永遠是空數組
    //這是創建單個id的方式
    NSArray *array2 = [NSArray arrayWithObject:@"jack"];
    //這是創建多個id的創建方式  nil是數組元素結束的標記
    NSArray *array3 = [NSArray arrayWithObjects:@"jack",@"rose", nil];
    //創建多個值的數組
    NSArray *array4 = [NSArray arrayWithObjects:@"jack",@"rose",@"Mike",@"Chenghao",nil];
    //快速創建一個NSArray對象
    NSArray *array5 = @[@"jack",@"rose",@"chegnhao"];
    
    /*
     NSArray的元素個數和訪問
     */
    //[array2 count];和以下方式都可以
    NSLog(@"%ld",array3.count);
    NSLog(@"%@",[array3 objectAtIndex:1]);//這種不用
    NSLog(@"%@",array3[1]);//以後都適用這種,編譯器遇到這行,就自動轉成上面的代碼

}

NSMutableArray:可變數組

#import <Foundation/Foundation.h>


int main(){
	/*
	NSSet 和 NSArray對比:
	1.共同點:
	>都是集合,都能存放多個OC對象
	>只能存放OC對象,不能存放非OC對象類型(基本數據類型:int、char、float、結構體、 枚舉等)
	>本身都不可改變,都有一個可變的子類
	2.不同點
	>NSArray有順序,NSSet沒有順序
	*/
	return 0;
}
void NSSet(){
	NSSet *s = [NSSet set];//創建一個空的set,並且永遠是空
	NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose",nil];
	[s2 anyObject];//隨機拿出一個元素
}
void NSMutableSet(){
	NSMutableSet *s = [NSMutableSet set];
	[s addObject:@"hack"];//添加元素
	[s removeObject:(id)];//刪除元素
}
void NSMutableArray(){
	//@[] 只創建不可變數組 NSArray
	NSArray *array = @[@"jack",@"rose"];
	NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"rose",@"jim",nil];//初始化時添加成員

	NSMutableArray *array = [NSMutableArray array];
	//添加元素
	[array addObject:[[Person alloc] init];
	[array addObject:@"Jack"];可以隨便放,但不能放基本數據類型
	//[array addObject:10];不行
	//刪除元素
	//[array removeAllObjects];//刪除所有元素
	//刪除指定對象
	[array removeObject:@"Jack"];
	[array removeObjectAtIndex:2];
		
	return 0;
}



考察NSString和NSArray的使用:===========計算代碼行數============

計算代碼行數
//考察NSString、NSArray的使用
//NSFileManager
#import <Foundation/Foundation.h>

/*
path:文件全路徑
返回代碼行數
*/
NSUInteger codeLineCount(NSString *path){
	//獲取文件管理者
	NSFileManager *mgr = [NSFileManager defaultManager];
	
	//判斷path是否是文件夾還是文件路徑
	BOOL dir = NO;//用來標記是否是文件夾
	//判斷路徑是否存在
	BOOL exist = [mgr fileExistsAtPath:path isDirectory:&dir];
	//如果不存在,直接返回0
	if(!exist){
		NSLog(@"文件路徑不存在"):
		return 0;
	}
	
	//不管傳的path是文件夾還是文件,都能返回行數
	if(dir){//=======================文件夾:遍歷並遞歸
		NSLog(@"這是個文件夾");
		NSArray *array = [mgr contentsOfDirectoryAtPath:path error:nil];
		int count = 0;
		for(NSString *filename in array){
			NSLog(@">>>>>>>>>>>>>%@",filename);//每到一個目錄文件夾就打印文件夾名
			NSString *nextFullPath = [NSString stringWithFormat:@"%@/%@",path,filename];
			count += codeLineCount(nextFullPath);
		}
		return count;
	}
	else{//===========================文件:判斷擴展名並計數
		NSLog(@"這是個文件");
		//獲取文件擴展名,並忽略大小寫
		NSString *extension = [[path pathExtension] lowercaseString];
		//判斷拓展名
		if(!([extension isEqualToString:@"h"]
			||[extension isEqualToString:@"m"]
			||[extension isEqualToString:@"c"])){
				NSLog(@"文件不是我們判斷的類型就返回");
				return 0;
			}
		//1.加載文件內容
		NSString *content = [NSString stringWithContentOfFile:path encoding:NSUTF8StringEncoding error:nil];
		//2.調用文件內容的分割爲每一行方法,以回車換行符來分割
		NSArray *array = [content componentsSeperatedByString:@"\n"];
		
		NSRange range = [path rangeOfString:@"/Users/ch/Desktop/"];
		NSString *str = [path stringByReplacingCharactersInRange:range withString:@""];//替換字符串
		
		NSLog(@"%@ - %ld",path,array.count);
		//直接返回行數
		return array.count;
	}

	
	
}
int main(){
	int count = codeLineCount(@"/Users/ch/Desktop/");
	NSLog(@"");
	return 0;
}
//測試分割方法
void testSeperated(){
	NSString *str = @"java-andriod-ios-c";
	NSString *str2 = @"jack\nrose\njim\njake";
	//測試下寫入到文件中的形式:
	[str2 writeToFile:@"/Users/ch/Destop/abc.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
	
	NSArray *array = [str componentsSeperatedByString:@"-"];
	for(NSString *s in array){
		NSLog(@"%@",s);
	}
}


------- android培訓java培訓、期待與您交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章