• Objective-C集合总结


    Objective-C里面的集合主要包括:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary

    首先,NSString,NSArray和NSDictionary都是不可变的,一经分配空间,长度是固定的。另外3个类是可变的,初始化后还可以动态增加空间,长度不固定。这几个类在初始化和相关操作上有一定的相似性,放在一起对比学习,能加深理解。数组和字典有一些特殊的地方需要注意,后面进行说明,先从初始化开始:

    字符串-NSString

    字面量创建:NSString *string = @"this is a string"; 

    格式化创建:+ (id) stringWithFormat:(NSString *) format,...;

    例如:NSString * str = [NSString stringWithFormat:@"Your age is %d,and your height is %d",26,140];

    从前面的+号可以看出,这是一个类方法

    1、比较大小

    方法一:- (BOOL) isEqualToString:(NSString *) aString

    用来比较接收方和作为参数传递过来的字符串,返回一个BOOL(YES或NO)来表示两个字符串的内容是否相同,例如:

    NSString *thing1 = @"hello 5";
    NSString *thing2 = [NSString:stringWithFormat:@"hello %d",5];
    if([thing1:isEqualToString:thing2])
    {
        NSLog(@"they are the same!");  
    }

    thing1==thing2与[thing1 isEqualToString:thing2]的区别,==运算符只判断thing1和thing2的指针数值是否相同,即:他们是否是同一事物;后者用来判断两个字符串的内容是否相同

    方法二:- (NSComparisonResult) compare: (NSString *) aString option: (NSStringCompareOptions) mask;

    compare方法将接收对象和传递过来的字符串逐个进行比较,返回一个NSComparisonResult(枚举类型)来表示比较结果。NSComparisonResult的定义如下:

    enum
    {
        NSOrderedAscending = -1,
        NSOrderedSame,
        NSOrderedDescending
    };
    typedef NSInteger NSComparisonResult

    参数option是一个掩位码,可以通过位或来添加标记,常用的标记如下:

    • NSCaseInsensitiveSearch:不区分大小写自负。
    • NSLiteralSearch:进行完全比较,区分大小写字符。
    • NSNumbericSearch:比较字符串的字符个数,而不是字符串值。如果没有这个选项,100会排在99的前面。

         如果你相比较字符串,需要忽略大小写并按字符个数进行排序,那么应该这么做:

    if([thing1 compare:thing2 option:NSCaseInsensitiveSearch | NSNumerbicSearch] == NSOrderedSame)
    {
        NSLog(@"They match!");
    }

     2、字符串包含

    起始处包含(以aString开头):- (BOOL) hasPrefix: (NSString *) aString;

    结尾处包含(以aString结尾):- (BOOL) hasSuffix: (NSString *) aString;

    内部包含(内部含有aString):- (NSRange) rangeOfString: (NSString *) aString;

    rangeOfString方法返回的是一个NSRange结构体,封装来字符串匹配的位置和能够匹配的字符个数,例如:

    NSString *fileName = @"draft-chapter.pages";
    NSRange range = [fileName rangeOfString:@"chapter"];
    //返回的range.location为6,range.length为7

    如果传递的参数在接收字符串中没有找到,那么range.location则等于NSNotFound。

    可变字符串-NSMutableString

    NSMutableString是NSString的子类,长度可变,类似于c#中的StringBuilder,声明如下:

    + (id) stringWithCapacity: (NSUInteger) capacity;

    这里的capacity只是个建议值,实际字符串大小并不限于所提供的容量。

    1、添加字符串:

    • - (void) appendString: (NSString *) aString;
    • - (void) appendFormat: (NSString *) format,...;

    例如:

    NSMutableString *string = [NSMutableString stringWithCapacity:50];
    [string appendString:@"Hello there "];
    [string appendFormat:@"human %d!",66];
    //最后string的值为:"Hello there human 66!"

    2、删除字符串

    方法:- (void) deleteCharactersInRange:(NSRange) aRange;

    NSMutableString *friends = [NSMutableString stringWithCapacity:50];
    [friends appendString:@"James BethLynn Jack Evan"];
    NSRange jackRange = [friends rangeOfString:@"jack"];
    jackRange.length++;
    [friends deleteCharactersInRange:jackRange];
    //最终结果:"James BethLynn Evan"

    NSMutableString是NSString的子类,所以任何使用NSString的地方都可以用NSMutableString来代替,例如,我们可以添加格式化字符串:

    NSMutableString *string = [NSMutableString stringWithFormat:@"jo%dy",2];  //string的值为"jo2y"

    不可变数组-NSArray

    NSArray是一个Cocoa类,它比C、C++数组强大的地方在于,NSArray可以保存任意类型的对象,比如字符串、自定义类型甚至其他数组或字典,但是请记住:NSArray只能保存对象,像int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。另外,NSArray是不可变数组,一旦创建它的长度就固定下来来,不能添加和删除任何元素,当然数组中包含的对象是可以改变的,只不过数组对象本身是一直都不会变的。

    NSArray的创建:

    • 1、NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",nil];
    • 2、NSArray *array1 = [NSArray arrayWithArray:array];(以现用的数组创建数组)
    • 3、NSArray *array2 = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];  //对象列表必须以nil结尾
    • 4、NSArray *array3 = @[@"one",@"two",@"three"]; //以字面量的方式创建时,不必在结尾处特意补上nil 

    相关方法:

      - (NSUInteger) count;   //获取数组中对象的个数

      - (id) objectAtIndex:(NSUInteger)index;  //获取指定索引处的对象

      还可以通过字面量访问数组,例如:id *myObject = array[1];我们可以利用计数和取值来遍历数组中的对象:

    //方式一
    NSUInteger count = [array count];
    for(NSUInteger i = 0; i < count; i++)
    {
         NSLog(@"index %d has %@.", i, [array objectAiIndex:i]);  
    }
    
    //方式二
    for(NSUInteger j = 0; j < count; j++)
    {
        NSLog(@"index %d has %@", j, array[j]);
    }

    NSArray还有一种特别的创建方式,就是通过切分字符串,方法的声明如下:

    - (NSArray) componentsSeparatedByString:(NSString *) separater;

    例如:NSString *string = @"oop:ack:bork:greeble:ponies";

       NSArray *chunks = [string componentsSeparatedByString:@":"];

    还可以反过来用指定字符串来合并NSArray中的元素来创建字符串,例如:

       string = [chunks componentsJoinedByString:@"+"]; //string的内容为:"oop+ack:bork+greeble+ponies"

    可变数组-NSMutableArray

    NSMutableArray的创建:+ (id) arrayWithCapacity:(NSUInteger) numItems;

    与NSMutableString中的stringWithCapacity方法一样,这里的容量只是一个建议值,当超出容量时可变数组能够动态的扩展空间。

    尾部添加对象:- (void) addObject:(id) anObject;

    指定索引处插入对象: - (void) insertObject:(id) anObject atIndex:(NSUInteger) index;  //后面的元素向后移

    删除指定索引处的对象: - (void) removeObjectAtIndex:(NSUInteger) index;  

    删除全部对象:- (void) removeAllObjects;

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:17]; //创建
    for(NSInteger i = 0; i < 4; i++) //在尾部添加四个对象
    {
        Tire *tire = [Tire new];
        [array addObject:tire];
    }
    Tire *t = [Tire new];
    [array insertObject:t atIndex:1]; //在第二个位置处添加一个对象 [array removeObjectAtIndex:
    1]; //删除索引为1的对象,即:第二个对象
    [array removeAllObjects];

    不可变字典-NSDictionary

       和c#中的字典一样,Objective-c中的NSDictionary能在给定关键字(通常是一个NSString字符串)下存储一个数值,然后可以通过这个关键词来查找相应的数据。相对于数组,字典采用的是键查询的优化方式,它可以立即找出要查找的数据,而不需要遍历整个数组,对于频繁的查询和大型数据集来说,使用字典比数组要快得多。

      像NSString和NSArray一样,NSDictionary也是不可变的,在创建新的NSDictionary时,就要提供该字典所存储的全部对象和关键字。

      基本操作:

      1、创建方式一:通过字面量方式,使用类似@{key:value,...}的方法来定义

      2、创建方式二:通过dictionaryWithObjectsAndKeys方法,该方法接受对象和关键字交替出现的序列,以nil值作为终止符号,定义如下:

      + (id) dictionaryWithObjectsAndKeys:(id) firstObject,...

      3、获取字典中的数据方式一:使用objectForKey,接收一个关键字,通过该关键字来获取对应的数据,该方法定义如下:

      - (id) objectForKey:(id) aKey;

      4、获取字典中的数据方式二:dictionary[key];

      示例代码如下:

     1 Tire *tire1 = [Tire new];
     2 Tire *tire2 = [Tire new];
     3 Tire *tire3 = [Tire new];
     4 Tire *tire4 = [Tire new];
     5 NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:tire1,@"front-left",tire2,@"front-right",tire3,@"back-left",tire4,@"back-right",nil];
     6 //字面量方式
     7 NSDictionary *tires = @{@"front-left":tire1,@"front-right":tire2,@"back-left":tire3,@"back-right":tire4};
     8 
     9 //获取方式一
    10 Tire *tire = [tires objectForKey:@"front-left"];
    11 //获取方式二
    12 Tire *tire = tires[@"front-left"];

    可变字典-NSMutableDictionary

      可以通过向NSMutableDictionary类发送dictionary消息来创建新的NSMutableDictionary对象,也可以通过dictionaryWithCapacity:方法来创建带初始大小的可变字典对象,这个方法的定义如下:

      + (id) dictionaryWithCapacity:(NSUInteger) numItems;

      与之前提到过的NSMutableString和NSMutableArray一样,在这里,字典的容量只是一个建议值,而不是对其大小的限制。

      可以通过setObject:forKey:的方法来为字典添加元素,定义如下:

      - (void) setObject:(id) andObject forKey:(id) aKey;

      如果对字典中已有的关键字使用setObject:forKey:方法,那么这个方法将会用新值替换原有的数据。如果想删除一些关键字,可使用removeObjectForKey:方法,定义如下:

      - (void) removeObjectForKey:(id) aKey;

      示例代码如下:  

     1 //创建词典对象,初始化长度为10
     2 NSMutableDictionary *tires = [NSMutableDictionary dictionaryWithCapacity:10];
     3 // NSMutableDictionary *tires = [NSMutableDictionary dictionary];
     4 
     5 //动态添加元素
     6 [tires setObject:tire1:forKey:@"front-left"];
     7 [tires setObject:tire2:forKey:@"front-right"];
     8 [tires setObject:tire3:forKey:@"back-left"];
     9 [tires setObject:tire4:forKey:@"back-right"];
    10 
    11 //删除元素
    12 [tires removeObjectForKey:@"back-left"];
  • 相关阅读:
    IsNull和IsEmpty的区别
    常用正则表达式
    VBScript函数
    SqlCommand类
    ubuntu更新grub
    例解 autoconf 和 automake 生成 Makefile 文件[转+个人修改]
    gEdit: 打造简洁,小巧的编程环境[转]
    Linux 常用命令
    GTK+ 简介
    “菜单” (menubar)和“工具栏”(toolbars)
  • 原文地址:https://www.cnblogs.com/neverstop/p/3879579.html
Copyright © 2020-2023  润新知