黑马软件工程师——Foundation框架常用类(NSArray/NSMutableArray)

黑马程序员——Foundation框架常用类(NSArray/NSMutableArray)
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

简介

        本文简单介绍了Foundation框架中常用的一些类的基本用法,分别简单介绍数组(NSArray/NSMutableArray)、集合(NSSet/NSMutableSet)、字典(NSDictionary/NSMutableDictionary)、数字(NSNumber/NSValue)、日期(NSDate)、数据(NSData/NSMutableData)。介绍了这些类的常用方法。

注意:这些类只能存放OC对象,如果想保存一些基本的C数据(例如,int, float, double, BOOL等),则需要将这些基本的C数据封装成NSNumber类型的对象保存到这些类中,NSNumber对象是OC对象,可以被保存在这些类中。


NSArray/NSMutableArray

NSArray:是OC中静态的数组(不可变数组),只能存放OC对象(不能存放非OC对象,如int等类型数据),数组的最后一个元素一定是nil,表示结束。

NSMutableArray:是OC中动态数组(可变数组),其继承与NSArray,可以随时改变里面存放的元素

1.    数组的创建

<pre name="code" class="objc" style="text-align: left;"><div style="text-align: left;"><pre name="code" class="objc"><pre name="code" class="objc"><pre name="code" class="objc">//第一种创建方式
NSArray *a1 = @[@"One"];

//第二种创建方式(initWithObjects)
NSArray *a2 = [[NSArray alloc]initWithObjects:@"Tow", nil];
NSMutableArray *ma2 = [[NSMutableArray alloc]initWithObjects:@"Tow", nil];

//第三种创建方式(arrayWithObject(s))
NSArray *a3 = [NSArray arrayWithObject:@"Three"];
NSMutableArray *ma3 = [NSMutableArray arrayWithObject:@"Three"];

//第四种创建方式(arrayWithArray)
NSArray *a4 = [NSArray arrayWithArray:a1];
NSMutableArray *ma4 = [NSMutableArray arrayWithArray:a1];

//第五种创建方式(读取文件,文件格式为XML)
NSArray *a5 = [NSArray arrayWithContentsOfFile:@"/Users/Mac/Desktop/IOS_study/a.xml"];
NSMutableArray *ma5 = [NSMutableArray arrayWithContentsOfFile:@"/Users/Mac/Desktop/IOS_study/a.xml"];

//第六种创建方式(copy(产生不可变数组)、mutableCopy(产生可变数组))
NSString *a6 = [ma2 copy];
NSString *ma6 = [a2 mutableCopy];




2.    数组的基本使用

由于NSMutableArray是NSArray的子类,那我只演示NSArray,NSMutableArray也和NSArray一致。

//创建一个数组
NSArray *array = [[NSArray alloc]initWithObjects:@"One",@"Tow",@"Three", nil];

//按照索引值取出元素
id noe = [array objectAtIndex:0];//去除第一个元素

//获取数组中的个数
NSUInteger count = [array count];//count = 3;

//判断数组中是否包含某个对象
BOOL isContenTow = [array containsObject:@"Tow"];//是否包含Tow这个对象

//返回一个对象在数组中的下标,找不到返回-1(NSNotFund)
NSUInteger threeIndex = [array indexOfObject:@"Three"];//查找Three在数组中的下标,threeIndex = 2;

//如果数组中存放的是字符串,可以将数组中的字符串连接成NSString
NSString *str = [array componentsJoinedByString:@"-"];//"-"为连接符,将数组中的元素连接成一个字符串。

//访问最后一个元素
id last = [array lastObject];

//在原数组后面添加一个对象,形成一个新的数组
NSArray *array1 = [array arrayByAddingObject:@"Four"];

//将一个字符串,通过特定的字符分割成数组
NSString *str1 = @"This is separator";
NSArray *array2 = [str1 componentsSeparatedByString:@" "];

//使用NSRange截取数组
NSRange range  = {1,2};
NSArray *array3 = [array subarrayWithRange:range];

/********NSMutableArray特有(NSArray没有的)*********/
//创建NSMutableArray
NSMutableArray *mutablearray = [array mutableCopy];
//忘NSMutableArray中添加元素
[mutablearray addObject:@"Five"];
//删除NSMutableArray中的元素
[mutablearray removeObject:@"One"];

3.    数组的高级使用

①常见素组的四种遍历方式:

<pre name="code" class="objc">NSArray *array = [NSArray arrayWithObjects:@1,@7,@3,@5, nil];

/*********以下演示NSArray的遍历方式*********/

//第一种:for 普通遍历方式
for(int i = 0;i < array.count; i++)
{
    NSLog(@"array[%i] = %@",i,array[i]);
    
}
//第二种:for..in 快速遍历方式
for (id obj in array) {
    NSLog(@"array[%ld] = %@",[array indexOfObject:obj],obj);
}
//第三种:Block 枚举遍历方式
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"array[%ld] = %@",idx,obj);
}];

//第四种:NSEnumerator 迭代器遍历方式
NSEnumerator *enumerator = [array objectEnumerator];
id obj = nil;
while (obj = [enumerator nextObject]) {
    NSLog(@"array[%ld] = %@",[array indexOfObject:obj],obj);
}



②常见以下四种排序方式

<pre name="code" class="objc">//第一种:简单排序(主要用于:NSString、NSNumber,这两个类中有compare方法)
NSArray *array1 = [NSArray arrayWithObjects:@1,@7,@3,@5, nil];
NSArray *sortArray1 = [array1 sortedArrayUsingSelector:@selector(compare:)];

//第二种:指定方法进行排序(按学生姓名排序)
//compareStudent为:Student中的一个对象方法,自己实现的。
NSArray *studentArray2 = [NSArray arrayWithObjects:s1,s2,s3,s4, nil];
NSArray *sortStudent2 =[studentArray2 sortedArrayUsingSelector:@selector(compareStudent:)];

//第三种:利用Block进行排序(按学生学号排序)
NSArray *studentArray3 =[NSArray arrayWithObjects:s1,s2,s3,s4, nil];
NSArray *sortStudent3 = [studentArray3 sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) {
    //调用字符串的compare方法
        return [obj1.no compare:obj2.no];

}];

//第四种:利用NSSortDescriptor(描述器,排序属性必须是NSString)进行排序( 姓名-》学号 :当姓名相同,学号小的在前面)
NSArray *studentArray4 =[NSArray arrayWithObjects:s1,s2,s3,s4, nil];

/*****建立NSSortDescriptor进行排序**************/
NSSortDescriptor *studentdescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSSortDescriptor *studentdescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"no" ascending:YES];
NSArray *array = [NSArray arrayWithObjects:studentdescriptor1,studentdescriptor2, nil];
NSArray *sortStudent4 = [studentArray4 sortedArrayUsingDescriptors:array];

附加排序过程使用到Student类Student.m文件中的代码:

//实现便利构造器(创建学生使用到了本方法)
+ (Student *)studentWithNo:(NSString *)no andName:(NSString *)name
{
    Student *stu = [[Student alloc]init];
    stu.no = no;
    stu.name = name;
    return stu;
}
//实现排序方法(利用第二种排序使用到了本方法)
- (NSComparisonResult)compareStudent:(Student *)student
{
    return [self.name compare:student.name];
}

③常见以下数组与其他类的转换方式

NSArray *array = @[@"1",@"2",@"3"];//NSArray *array = @[@1,@2,@3];
//NSArray->NSString(NSArray中存放OC对象必须是NSString/NSNumber类型)
NSString *string = [array componentsJoinedByString:@"-"];
//string = @"1-2-3"(利用“-“符号进行连接)

//NSString->NSArray(字符串中,利用”-“符合对字符串进行拆分)
NSArray *array1 = [string componentsSeparatedByString:@"-"];
//array1 = @[@"1",@"2",@"3"];

④实力应用

实例示范:
利用NSArray进行排序:创建5个学生,学生属性有(学号、姓名、年龄、分数),现在将创建的5和学生进行排序(分数->年龄->学号),分数排降序,分数一样,按年龄排升序,年龄一样,按学号排降序。(因为学生年龄和分数不是NSString类型),所以不能用NSSortDescriptor进行排序。
学生类Student.h文件
#import <Foundation/Foundation.h>

@interface Student : NSObject
@property (nonatomic,copy) NSString *no;//学号
@property (nonatomic,copy) NSString *name;//姓名
@property (nonatomic,copy) NSNumber *age;//年龄
@property (nonatomic,copy) NSNumber *score;//分数

//定义一个便利构造器
+ (Student *) studentWithNo:(NSString *)no andName:(NSString *)name
                     andAge:(NSNumber *)age andScore:(NSNumber *)score;
//定义一个排序方法
- (NSComparisonResult) compareStudent:(Student *)student;

@end
学生类Student.m文件
#import "Student.h"
@implementation Student

//实现便利构造器(创建学生使用到了本方法)
+(Student *)studentWithNo:(NSString *)no andName:(NSString *)name andAge:(NSNumber *)age andScore:(NSNumber *)score
{
    Student *stu = [[Student alloc]init];
    stu.no = no;
    stu.name = name;
    stu.age = age;
    stu.score = score;
    return stu;
    
}

//实现学生排序:分数降序,其他升序(分数->年龄->学号)
- (NSComparisonResult)compareStudent:(Student *)student
{
    //比较两个学生的分数
    NSComparisonResult result = [student.score compare:self.score];
    //分数一样,比较两个学生的年龄
    if (result == NSOrderedSame) {
        result = [self.age compare:student.age];
        //学生年龄一样,比较学生学号
        if (result == NSOrderedSame) {
            result = [self.no compare:student.no];
        }
    }
    //最后将比较结果返回
    return result;
}

//重写description方法,利用NSLog答应输出时候调用
-(NSString *)description
{
    return [NSString stringWithFormat:@"\n学号:%@\n姓名:%@\n年龄:%@\n分数:%@",_no,_name,_age,_score];
}

@end
主函数main.m文件
#import <Foundation/Foundation.h>
#import"Student.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"***************NSArray欢迎您**************");
        Student *s1 = [Student studentWithNo:@"0001" andName:@"Zhangsan" andAge:@22 andScore:@89];
        Student *s2 = [Student studentWithNo:@"0002" andName:@"Rose" andAge:@22 andScore:@89];
        Student *s3 = [Student studentWithNo:@"0003" andName:@"Lisi" andAge:@24 andScore:@92];
        Student *s4 = [Student studentWithNo:@"0004" andName:@"Wangwu" andAge:@26 andScore:@89];
        Student *s5 = [Student studentWithNo:@"0005" andName:@"Zhaoliu" andAge:@22 andScore:@97];
        NSArray *students = [NSArray arrayWithObjects:s1,s2,s3,s4,s5, nil];
        //对这五个学生进行排序,分数按降序,其他按升序拍(分数->年龄->学号)
        NSArray *sortStudents = [students sortedArrayUsingSelector:@selector(compareStudent:)];
        for (id obj in sortStudents) {
            NSLog(@"%@",obj);
        }
    }
    return 0;
}
结果输出:
2015-05-03 22:12:37.772 09-NSArray等排序问题[2879:177300] ***************NSArray欢迎您**************
2015-05-03 22:12:37.773 09-NSArray等排序问题[2879:177300] 
学号:0005
姓名:Zhaoliu
年龄:22
分数:97
2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 
学号:0003
姓名:Lisi
年龄:24
分数:92
2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 
学号:0001
姓名:Zhangsan
年龄:22
分数:89
2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 
学号:0002
姓名:Rose
年龄:22
分数:89
2015-05-03 22:12:37.774 09-NSArray等排序问题[2879:177300] 
学号:0004
姓名:Wangwu
年龄:26
分数:89


注意:以上第3种排序采用比较函数的是NSString、NSNumber类型,非NSString、NSNumber类型的请自己写比较函数。(NSString、NSNumber内部都有compare:方法),第4种排序采用的比较函数只有NSString类型,非NSString类型的不能用这种排序。

参考文献

SuperHappy的博客园--博客(NSString)

JiangWei0910410003的****--博客(NSArray/NSMutableArray)