Objective-C中NSArray的基本用法示例

NSArray的排序

代码如下:

+ (id)studentWithFirstName:(NSString *)firstName lastName:(NSString *)lastName{ 
     
    Student *stu = [[Student alloc] init]; 
     
    stu.firstName = firstName; 
    stu.lastName = lastName; 
     
    return stu; 

 
+ (id)studentWithFirstName:(NSString *)firstName lastName:(NSString *)lastName bookName:(NSString *)bookName{ 
 
    Student *stu = [Student studentWithFirstName:firstName lastName:lastName]; 
     
    stu.book = [Book bookWithName:bookName]; 
     
    return stu; 
 

 
- (NSComparisonResult)compareStudent:(Student *)stu{ 
     
    NSComparisonResult result = [self.firstName compare:stu.firstName]; 
     
    if (result == NSOrderedSame) { 
        result = [self.lastName compare:stu.lastName]; 
    } 
     
    return result; 
     

 
- (NSString *)description{  
  
    //return [NSString stringWithFormat:@" %@ %@ %@",self.firstName,self.lastName,self.book.name]; 
    return [NSString stringWithFormat:@" %@ %@ %@",self.firstName,self.lastName,_book.name]; 

 
 
#pragma mark 3.NSArray排序1 
void arraySort1(){ 
     
    NSArray *array = [NSArray arrayWithObjects:@"2",@"3",@"1",@"4", nil nil]; 
     
    // 指定系统自带规定的比较方法compare: 
    NSArray *array2 = [array sortedArrayUsingSelector:@selector(compare:)]; 
    NSLog(@"%@",array2); 
     

 
#pragma mark 3.NSArray排序2 
void arraySort2(){  
      
    Student *stu1 = [Student studentWithFirstName:@"hu" lastName:@"mingtao"]; 
    Student *stu2 = [Student studentWithFirstName:@"zhu" lastName:@"wenpeng"]; 
    Student *stu3 = [Student studentWithFirstName:@"zhao" lastName:@"weisong"]; 
    Student *stu4 = [Student studentWithFirstName:@"hu" lastName:@"junpeng"]; 
     
    NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil nil]; 
     
    // 类似JAVA中得compareTo,自己定义比较方式,但是一定要实现compare方法 
    NSArray *array2 = [array sortedArrayUsingSelector:@selector(compareStudent:)]; 
     
    NSLog(@"%@",array2); 
 

 
#pragma mark 3.NSArray排序3-Block排序 
void arraySort3(){ 
     
    Student *stu1 = [Student studentWithFirstName:@"hu" lastName:@"mingtao"]; 
    Student *stu2 = [Student studentWithFirstName:@"zhu" lastName:@"wenpeng"]; 
    Student *stu3 = [Student studentWithFirstName:@"zhao" lastName:@"weisong"]; 
    Student *stu4 = [Student studentWithFirstName:@"hu" lastName:@"junpeng"]; 
     
    NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil nil]; 
     
    NSArray *array2 = [array sortedArrayUsingComparator:^NSComparisonResult(Student *obj1, Student *obj2) { 
        NSComparisonResult result = [obj1.firstName compare:obj2.firstName]; 
         
        if (result == NSOrderedSame) { 
            result = [obj1.lastName compare:obj2.lastName]; 
        }  
          
        return result; 
    }]; 
     
    NSLog(@"%@",array2); 
 
     
}  
 
#pragma mark 4.NSArray排序4-高级排序 
void arraySort4(){ 
     
    Student *stu1 = [Student studentWithFirstName:@"hu" lastName:@"mingtao" bookName:@"lianai"]; 
    Student *stu2 = [Student studentWithFirstName:@"zhu" lastName:@"wenpeng" bookName:@"tianshi"]; 
    Student *stu3 = [Student studentWithFirstName:@"zhao" lastName:@"weisong" bookName:@"love"]; 
    Student *stu4 = [Student studentWithFirstName:@"hu" lastName:@"junpeng" bookName:@"qingren"]; 
     
    NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3,stu4, nil nil]; 
     
    // 1.先按照书名进行排序 
    NSSortDescriptor *bookNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES]; 
    // 2.先按照姓进行排序 
    NSSortDescriptor *firstNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
    // 3.先按照名进行排序 
    NSSortDescriptor *lastNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES]; 
 
    NSArray *array2 = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:bookNameDesc,firstNameDesc,lastNameDesc, nil nil]]; 
     
    NSLog(@"%@",array2);  
      
     
}

NSArray的一些用法
NSArray  只允许装OC对象,并且不能装空值,空代表数组元素的结束

代码如下:

#pragma mark - NSArray的基本用法
   // 创建一个空数组
      NSArray *array = [NSArray array];
   // 创建有一个元素的数组
      array = [NSArray arrayWithObject:@"123"];
    // 创建有多个元素的数组
      array = [NSArray arrayWIthObjects:@"a",@"b",nil ];//不能装nil空指针,空值代表数组元素结束
    // 将一个数组赋值给一个数组
    + (instancetype)arrayWithArray:(NSArray *)array;
    // 获取元素的个数
       int count = [array count]; //和 count = array.count; 相同,都是调用get方法
    // 是否包含一个元素
      - (bool)containsObject:(id)anObject;
    // 返回最后一个元素
       - (id) lastObject;
     // 获取index位置的元素
        - (id)objectAtIndex:(NSUInteger) index;
     // 获取元素的位置
        - (NSUInteger) indexOfObject:(id)anObject;
     // 在range范围内查找元素的位置
        - (NSUInteger) indexofObject:(id)anObject inRange:(NSRange)range;
     // 比较两个集合内容是否相同
        - (Bool) isEqualToArray:(NSArray *)otherArray;
     // 返回两个集合中第一个相同的对象元素
        - (id) firstObjectCommonWithArray:(NSArray *)otherArray;

#pragma mark - NSArray的高级用法
        //让集合里面的所有元素都执行aSelector这个方法
           - (void)makeObjectsPerformSelector:(SEL)aSelector;
        //让集合里面的所有元素都执行aSelector这个方法,给这个方法添加参数,但是只支持一个参数
           - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument
        //添加一个元素,返回一个新的NSArray(方法调用者本身没有发生变化)
           - (NSArray *)arrayByAddingObject:(id)anObject
       //添加otherArray的所有元素,返回一个新的NSArray(方法着本身没有改变)
           - (NSArray *) arrayByAddingObjectsFromArray:(NSArray *) otherArray;
       //截取range范围的数组
           - (NSArray *) subarrayWithRange:(NSRenge)range;
      //用separator做拼接符,拼接成一个字符串
           - (NSString *) componentsJoinedByString:(NSString *)separator
      //将NSArray持久化到文件中去
           - (Bool) writeToFile:(NSString *)path atomically:(Bool)useAuxiliaryFile

#pragma mark - NSArray的遍历
     // 方法一:普通遍历(利用for循环)
       void arrayFor1(){
        NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
        int count = array.count;
        for(int i=0; i<count; i++){
              id obj = [array objectAtIndex:i];
             NSLog(@"%i-%@",i, obj);
        }
       }

// 方法二:快速遍历
       void arrayFor2(){
           NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
           int count = array.count;
           int i=0;
           for(id obj in array){
                NSLog(@"%i-%@",i, obj);
                i++;
           }
         }

// 方法三:利用block遍历
          void arrayFor3(){
               NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
               [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                       NSLog(@"%zi->%@",idx, obj);
                        //  *stop = YES; //改变外边的Bool,终止遍历
                  }];
             }

// 方法四:利用迭代器
 先介绍一下-->NSEnumerator迭代器:集合的迭代器,可以用于遍历集合元素,NSArray 有相应的方法来获取迭代器
                  //获取一个正序遍历的迭代器
                     - (NSEnumerator *) objectEnumerator;
                 //获取一个反序遍历的迭代器
                     - (NSEnumerator *) reverseObjectEnumerator;
                @常用方法:
                 //获取下一个元素
                    - (id) nextObject;
                 //获取所有的元素
                    - (NSArray *) allObjects
          void arrayFor4(){
                   NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
                   NSEnumerator *enumerator = [array objectEnumerator];// 返回数组的迭代器
                   //如果放到遍历之后,则取到空,原因是,遍历完了,就没值了
                   NSArray *array2 = [enumerator allObjects];
                   NSLog(@"array2=%@", array2);
   
                 //获取下一个需要遍历的元素
                   id obj = nil;
                   while (obj = [enumerator nextObject]) {
                         NSLog(@"obj=%@", obj);
                   }
                  }

使用block 块遍历整个数组。这个block 需要三个参数,id obj 表示数组中的元素。 
NSUInteger idx 标示元素的下标, 
boolbool *stop 是一个bool类型的参数。 官方描述如下: 
A reference to a Boolean value. The block can set the value to YES to stop further processing of the array.  
The stop argument is an out-only argument. You should only ever set this Boolean to YES within the Block. 
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx,BOOLBOOL *stop))block  
调用例子如:

代码如下:

NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil nil];  
  
  
   [array enumerateObjectsUsingBlock:^(id str,NSUInteger index, BOOL* te){ 
       NSLog(@"%@,%d",str,index); 
   }];

同上面的方法一项,区别在于,这里多添加了一个参数,用来标示 是从前向后遍历,还是从后往前遍历。 
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx,BOOLBOOL *stop))block 
调用例子如下:

代码如下:

NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil nil]; 
 
 
    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id str,NSUInteger index, BOOL* te){ 
        NSLog(@"%@,%d",str,index);  
    }];

(0)

相关推荐

  • Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍

    迁移工作正好提供了一个重新审视现有 Objective-C 应用程序的机会,也可以通过 Swift 代码来更好的优化应用程序的体系架构,逻辑以及性能.直接的说,你将用先前学到的 mix and match 以及这两个语言间的互操作性来进行增量迁移工作.Mix-and-match 功能使得选择哪些特性和功能来用 Swift 来实现,哪些依然用 Objective-C 来实现变得简单.Swift 和 Objective-C 的互用性又使得将这些功能集成到 Objective-C 变得并不困难.通过这

  • 使用Objective-C获取IPHONE手机IMSI序列号

    获取IPhone 的IMSI序列号 #include <dlfcn.h> #define PRIVATE_PATH "/System/Library/PrivateFrameworks/CoreTelephony.framework/CoreTelephony" - void getImsi(){ #if !TARGET_IPHONE_SIMULATOR void *kit = dlopen(PRIVATE_PATH,RTLD_LAZY); NSString *imsi =

  • objective-c中生成随机数的方法

    本文简述objective-c中生成随机数的几种常见的方法,分享给大家,希望能给大家带来一点借鉴价值.具体如下: 1).arc4random()方法:比较精确不需要生成随即种子 使用方法如下 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc4random() % x; 获取1到x之间的整数的代码如下: int value = (arc4random() % x) + 1; 2).CCRANDOM_0_1()方法:在cocos2d中使用 ,范围

  • Objective-C 消息传递机制详解

    Objective-C语言中方法的传递有二种:①Selector ② Blocks,本文主要说一下Selector,关于Blocks会在后续总结一下. 消息传递模型(Message Passing)是Objective-C语言的核心机制.在Objective-C中,没有方法调用这种说法,只有消息传递. 在C++或Java中调用某个类的方法,在Objective-C中是给该类发送一个消息.在C++或Java里,类与类的行为方法之间的关系非常紧密,一个方法必定属于一个类,且于编译时就已经绑定在一起,

  • Swift能代替Objective-C吗?

    我文章的中心是,以 Apple 目前给出的各种资料来看,这语言不会替代掉ObjC,它不是下一代的ObjC.它有很多缺点,使得它不足以做大型项目.这些缺点使得,Apple 自己都没有使用它做 Mac/iOS 的 app.我不排除明年后年它有很大改进,但至少现在还没有这端倪. 因此,如果你会ObjC,你不需要去看它. 但你如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是 Apple 在 WWDC 向全世界推出的重磅语言我怎麽能说它不重要? 它降低了入门的门槛.使得大量的

  • 在Swift中使用Objective-C编写类、继承Objective-C类

    互用性(互操作性)使开发者可以定义融合了 Objective-C 语言特性的Swift类.编写 Swift 类时,不仅可以继承 Objective-C 语言编写的父类,采用 Objective-C 的协议,还可以利用 Objective-C 的一些其它功能.这意味着,开发者可以基于 Objective-C 中已有的熟悉.可靠的类.方法和框架来创建 Swift 类,并结合 Swift 提供的现代化和更有效的语言特点对其进行优化. 继承Objective-C的类 在 Swift 中,开发者可以定义一

  • Objective-C中NSLog输出格式大全

    ?    %@        对象 ?    %d, %i   整数 ?    %u         无符整形 ?    %f          浮点/双字 ?    %x, %X  二进制整数 ?    %o         八进制整数 ?    %zu       size_t ?    %p        指针 ?    %e        浮点/双字 (科学计算) ?    %g        浮点/双字 ?    %s        C 字符串 ?    %.*s     Pascal

  • 全面解析Objective-C中的block代码块的使用

    1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由

  • 在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实现应用的一部分功能,并无缝地并入已有的 Objective-C 的代码中. Mix and Match 概述 Objective-C 和 Swift 文件可以在一个工程中并存,不管这个工程原本是基于 Objective-C 还是 Swift.你可以直接往现有工程中简单地添加另一种语言的源文件.这种自

  • Swift调用Objective-C代码

    最近iOS开发之新编程语言Swift在iOS开发圈内反响比较大,国内外都有很多教程或小示例. 虽然Swift这门语言仍然在不断的进化之中,而且变动还是比较大,苹果公司也不承诺目前所写代码会在将来兼容,但仍挡不住iOS开发者的热情. 为什么要使用Swift调用Objective-C代码 目前Swift语言所编写的应用才刚刚可以使用Xcode 6 GM版本提交,而Objective-C作为苹果的主开发语言存在了很多年了.目前尚无成熟的Swift库可用,所以当前编写应用可以说基本离不开调用Object

  • Swift调用Objective-C编写的API实例

    互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定义并提高你写 Cocoa 应用的方案. 互用性很重要的一点就是允许你在写 Swift 代码时使用 Objective-C 的 API 接口.当你导入一个 Objective-C 框架后,你可以使用原生的 Swift 语法实例化它的 Class 并且与之交互. 初始化 为了使用 Swift 实例化 O

  • Objective-C中的重载和重写详解

    Objective-C 重载和重写 首先,Objective-C中不完全支持重载,网上很多人要么将重载和重写搞混,要么说OC不支持重载(当然按照重载严格定义说OC不支持重载也没错),事实上OC支持参数个数不同的函数重载. 问题: Objective-C和Swift中有重载吗? Swift中有重载,但Objective-C中基本不支持重载. 展开: 重载.重写和隐藏三者在编程语言中的定义 重载(overload):函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同.重

随机推荐