黑马程序员——IOS基础——Foundation框架——结构体、字符串、数组

时间:2022-08-31 00:27:11

------- 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培训、期待与您交流!