黑马程序员——Foundation框架之结构体、字符串和集合

   ——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——
Foundation是一种基础框架,框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios
框架的基础。
如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了,
即:#import<Foundation/Foundation.h>

结构体

在Foundation中常用4种结构体

1> 表示范围——NSRange(location length) ,其中location表示位置,length表示长度。
1)表示字符串的范围

NSRange r1 = {6,2}; // 可读性差
NSRange r2 = {.location = 6, .length = 2}; // 太乱,不用
NSRange r3 = NSMakeRange(6,2); // 掌握

2)查找字符串中某个字符的范围

NSString *str = @"today is monday";
NSRange range = [str rangeOfString:@"is"];
NSLog(@"location = %ld,range = %ld”,range.location,range.length);

注:数据类型为ld;

2> 表示坐标——NSPoint/CGPoint

CGPoint p1 = NSMakePoint(6, 9);
NSPoint p2 = CGPointMake(6, 9); // 常用

注:坐标以左上角为原点,向右为x轴正方向,向下为轴正方向。

3> 表示尺寸——NSSize/CGSize

NSSize s1 = CGSizeMake(100, 50);
NSSize s2 = NSMakeSize(100, 50);
CGSize s3 = NSMakeSize(200, 60);

4> 表示一个UI元素的尺寸和位置——NSRect/CGRect(CGPoint CGSize)

创建结构体变量的方式

CGRect r1 = CGRectMake(0, 0, 100, 50);
CGRect r2 = { {0, 0}, {100, 90}};
CGRect r3 = {p1, s2};
CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};

注:使用CGPointZero等的前提是添加CoreGraphics框架,导入框架:Build phase->link (+)
CGPointZero == CGPointMake(0, 0);
同理还有CGSizeZero\CGRectZero

在开发中,若想要验证结构体中属性的值,可以利用框架函数把相应的结构体转变成字符串,再直接打印字符串。
例:

NSString *str1 = NSStringFromPoint(p1);
NSString *str2 = NSStringFromSize(s3);
NSString *str3 = NSStringFromRect(r1);
NSLog(@"%@", str1);

5> Foundation框架中一些经常用到的结构体函数

1)比较两个点是否相同——CGPointEqualToPoint

BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));

同理:
CGSizeEqualToSize(<#CGSize size1#>, <#CGSize size2#>)
CGRectEqualToRect(<#CGRect rect1#>, <#CGRect rect2#>)

2)判断Point是否在Rect范围内—— CGRectContainsPoint

BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), 
CGPointMake(60, 45));
NSLog(@"%d", b2); // b2 = 1;

字符串

NSString和NSMutableString的用法及注意:

NSString—不可变字符串;
NSMutableString—可变字符串;

字符串的创建方式

// 方式1
NSString *str1 = @"hello"; 
// 方式2,不提倡
NSString *str2 = [[NSString alloc] initWithString:@"hello"]; 
// 方式3
NSString *str3 = [[NSString alloc]initWithFormat:@"age is %d",20];
// 方式4,C字符串——>OC字符串
NSString *str4 = [[NSString alloc] inWithUNTF8String:"hello"];
// OC字符串——>c字符串 
const char *c = [str4 UNTF8String]; 
// 方式5
NSString *str5 = [[NSString alloc] initWithContentsOfFile:
@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil]; 
// 方式6
NSURL *url = [[NSURL alloc] initWithString:
@"file:///Users/apple/Desktop/1.txt"]; 
NSURL *url1 = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
NSString *str6 = [[NSString alloc] initWithContentsOfURL:
url1 encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str6 = %@",str6);

字符串的导入和导出

字符串的导出

// 把字符串写入到文件中,文件不存在则创建
[@"Jack\nJack" writeToFile:@"/Users/apple/Desktop/my.txt" automically :
YES encoding:NSUTF8StringEncoding error:nil]; 
// 把字符串写入到源位置
NSString *str = @"Jack";
NSURL *url = [NSURL  fileURLWithPath:@"file:///Users/apple/Desktop/1.txt"] ;
[str writeToURL:url automically:YES encoding:
NSUTF8StringEncoding error:nil];
// 这里的automically后面一般是YES, 若中途写入失败则不再创建,更安全

3)类方法

// 一般都会有一个类方法与对象方法相对应,类方法通常以类名开头
[NSString stringWithFormat:@""];
[NSURL URLWithString:(NSString *)];
[NSString stringWithContentsOfFile:(NSString *) encoding :
(NSStringEncoding) error:(NSError *__autoreleasing *)];

4)NSMutableString的使用注意

// 拼接
NSMutableString *s1 = [NSMutableString stringWithFormat:"age is %d",10];
// 拼接到s1后面
[s1 appendingString:@" 11 12"];
// 删除
NSRange range = [s1 rangeOfString:@"is"]; // 获取范围
[s1 deleteCharactersInRange:range]; // 删除
// 不可变字符串
NSString *s2 = [NSString sstringWithFormat:@"age is 6"];
NSString *s3 = [s2 stringByAppendingString:@" 7 8"];
// 此方法是把s2内容拷贝一份,再拼接上后边的字符串组成新字符串返回s3,s2本身不变
NSLog(@"s1=%@, s2=%@, s3=%@",s1,s2,s3);

运行结果:
NSString[1036:154815] s1=my age 10 11 12,
s2=age is 6, s3=age is 6 7 8

集合

NSArray和NSMutableArray

NSArray不可变数组

1、NSArray的基本介绍

NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组;

C语言数组有一个缺点即数组中只能存放同种数据类型的元素;

OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等。
2、NSArray的创建

NSArray *array1 = [NSArray arrayWithObject:@"jack"]; 
// object代表任何对象,但只能放一个

NSArray *array2 = [NSArray arrayWithObjects:@"jack", @"rose", nil]; 
// objects代表多个对象,且nil不可少,是数组元素结束的标记

NSArray *array3 = @[@"jack", @"rose", @"4324324"];
// 快速创建一个NSArray对象

3、NSArray的元素个数

[array1 count]; // 等价于array.count

NSLog(@"%ld", array1.count);// 数据类型ld

3、NSArray的访问


NSLog(@"%@", [array3 objectAtIndex:1]); 
// 结果rose,旧方法,不提倡

NSLog(@"%@", array3[0]); 
// 简洁,提倡

4、NSArray的遍历

首先创建一个数组

NSArray *array = @[@"jack",@"rose",@"dave"];

第一种方法:使用for循环遍历


// 方法1   
for (int i = 0; i<array.count; i++)
{
    NSLog(@"%@", array[i]);
}

// 方法2   
for(id obj in array)
{
    NSLog(@"%@",obj);
}
// id obj代表着数组中的每一个元素

// 方法3    
int i = 0;
for (id obj in array)
{
    NSLog(@"%ld - %@", i, obj);
    i++;
}

// 方法4
for (id obj in array)
{
    // 找出obj元素在数组中的位置
    NSUInteger i = [array indexOfObject:obj];
    //obj在数组array中的位置,返回值类型NSUInteger
    NSLog(@"%ld - %@", i, obj);
    i++;

    if (i==1)//停止遍历
    {
    break;
    }
}

// 方法5
// 每遍历到一个元素,就会调用一次block(代码段)
// 并且当前元素和索引位置当做参数传给block
[array enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop)
{
    NSLog(@"%ld - %@", idx, obj);

    if (idx == 0)
    {
        // 停止遍历
        *stop = YES;
    }
};

// 注意1:break只使用在两种场合,即switch和循环结构中。
// 注意2:stop参数用来停止遍历,其值若为YES,则停止。

NSMutableArray可变数组

NSMutableArray的基本使用

注意:

1> NSMutableArray继承自NSArray,几乎拥有NSArray的一切方法

2> 创建NSMutableArray不可以使用@[ ] ,@[ ]只创建不可变数组NSArray

// 错误写法
NSMutableArray *array = @[@"jack", @"rose"];

// @[  ]只创建不可变数组NSArray
NSArray *array = @[@"jack", @"rose"];

基本使用:

// 创建可变数组
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];

// 添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];

// 删除元素
[array removeAllObjects];

// 删除指定的对象
[array removeObject:@"jack"];
[array removeObjectAtIndex:0];

// 不能添加空,错误写法
// [array addObject:nil];

// 计算元素个数    
NSLog(@"%ld", array.count);
}

NSSet和NSMutableSet

NSSet不可变集合

基本使用:

NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];

// 随机拿出一个元素
NSString *str = [s2 anyObject];
NSLog(@"%@", str);

NSMutableSet可变集合

基本使用:

NSMutableSet *s = [NSMutableSet set];

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

// 删除元素
// [s removeObject:<#(id)#>];

NSSet和NSArray的对比

1、共同点:

1> 都是集合,都能够存放多个对象
2> 只能存放oc对象,不能存放非oc对象类型(如int等基本数据类型和结构体,枚举等)
3> 本身都不可变,都有一个可变的子类

2、不同点:

NSArray有顺序,NSSet没有顺序

NSDictionary和NSMutableDictionary

NSDictionary不可变字典

1、介绍

OC中的NSDictionary:根据key找到value,里面存储的东西都是键值对

字典不允许有相同的key,但允许有相同的value(Object)

字典是无序的

2、NSDictionary的创建

// 方法1
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];

// 方法2 
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

// 方法3
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
     @"jack", @"name",
     @"北京", @"address",
     @"32423434", @"qq", nil];

// 方法4
NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};

注意:快速创建字典是编译器特性。

3、NSDictionary的访问

id obj = dict[@"name"];
NSLog(@"%@", obj);

// 返回的是键值对的个数
NSLog(@"%ld", dict.count);
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];
NSLog(@"%@", bookName);

// 先取出1位置对应的字典
// 再取出字典中qq这个key对应的数据
NSLog(@"%@", persons[1][@"qq"]);

运行结果:
2015-04-28 23:23:24.018 06-NSDictionary[1689:114110] 5分钟突破android编程
2015-04-28 23:23:24.019 06-NSDictionary[1689:114110] 767567

4、NSDictionary的遍历

    NSDictionary *dict = @{
    @"address" : @"北京",
    @"name" : @"jack",
    @"name2" : @"jack",
    @"name3" : @"jack",
    @"qq" : @"7657567765"};

    [dict enumerateKeysAndObjectsUsingBlock:
     ^(id key, id obj, BOOL *stop) {
         NSLog(@"%@ - %@", key, obj);

     // *stop = YES;
     }];

NSMutableDictionary可变字典

1、NSMutableDictionary的基本使用

NSMutableDictionary *dict = @{@"name" : @"jack"};
[dict setObject:@"rose" forKey:@"name"];


NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];

// 添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
[dict setObject:@"rose" forKey:@"name"];

// 移除键值对
[dict removeObjectForKey:<#(id)#>];

2、NSMutableDictionary的使用注意

注意:@{key1 : value1, key2 : value2}这种快速创建的方式只适用于不可变字典。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值