Foundation框架解析

来源:互联网 发布:怎么进入淘宝达人 编辑:程序博客网 时间:2024/05/16 15:16

字符串(NSString与NSMutableString)

创建字符串

int main(int argh, char * argv[]){    @autoreleasepool    {        //定义unichar数组,该数组是个基本类型,就是unsigned short的别名        unichar data[6] = {1, 2, 3, 4, 5, 6};        //使用Unicode数值数组初始化字符串        NSString* str = [[NSString alloc] initWithCharacters:data length:6];        NSLog(@"%@", str);        char* caster = "Heloo, IOS!";        //将c风格字符串转化为NSString对象        NSString* str2 = [NSString stringWithUTF8String:cstr];        NSLog(@"%@", str2);        //将字符串写入制定文件        [str2 writeToFile:@"myFile.txt"         atomically:YES         encoding:NSUTF8StringEncoding        error:nil];        //读取文件内容,用文件内容初始化字符串        NSString* str3 = [NSString stringWithContentsOfFile:@"Test.m"        encoding:NSUTF8Encoding        error:nil];        NSLog(@"%@", str3);    }}

NSString的常用功能

#import <Foundation/Foundation.h>int main(int argh, char * argv[]){    @autoreleasepool    {        NSString* str = @"Hello";        NSString* book = @"《西游记》";        //在str后面追加固定字符串,该方法未改变原字符串对象,只是将新生成的字符串重新赋值给了str指针变量        str = [str stringByAppendingString:@",IOS!"];        NSLog(@"%@", str);        //获取字符串对应的C风格字符串        const char* cstr = [str UTFString];        NSLog(@"获取的C字符串:%s", caster);        //在str后面追加呆变量的字符串        str = [str stringBtAppendingFormat:@"%@很好看!", book];        NSLog(@"%@", str);        NSLog(@"str的字符格式为:%lu", [str length]);        NSLog(@"str按UTF8字符集解码后的字节数为:%lu", [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);        //获取str前是个字符组成的字符串        NSString* s1 = [str substringToIndex:10];        NSLog(@"%@", s1);        //获取str从第5个字符开始与后面字符组成的字符串        NSString* s2 = [str substringFromIndex:5];        NSLog(@"%@", s2);        //获取从第5到第15个字符组成的字符串        NSString* s3 = [str substringWithRang:NSMakeRang(5, 15)];        NSLog(@"%@", s3);        //获取 IOS 在 str 中出现的位置        NSRange pos = [str rangeOfString:@"IOS"];        NSLog(@"IOS 在 str 中出现的开始位置是:%ld ,长度为:%ld", pos.location, pos.length);        //将 str 中的字符转为大写        str = [str uppercaseString];        NSLog(@"%@", str);    }}

可变字符串(NSMutableString)

NSString对象的字符序列是不可更改的,直至对象被销毁,与NSString对象不同的是,NSMutableString对象则代表一个字符序列可变的字符串,而且NSMutableString是NSString得子类,这代表NSString的所有方法,NSMutableString也是可用的。

#import <Foundation/Foundation.h>int main(int argh, char * argv[]){    @autoreleasepool    {        NSString* book = @"《西游记》";        //创建一个 NSMutableString 对象        NSMutableString* str = [NSMutableString stringWithString:@"Hello"];         //追加固定字符串,由于是字符串包含的字符序列发生了改变,因此无需重新赋值        [str appendString:@",IOS!"];        NSLog(@"%@", str);        //追加呆变量的字符串        [str appendFormat:@"%@很好看!", book];        NSLog(@"%@", str);        //在指定位置插入字符串        [str insertString:@"MyInsert" aIndex:6];        NSLog(@"%@", str);        //删除从位置6到位置12的字符        [str deleteCharactersInRange:NSRange(6, 12)];        NSLog(@"%@", str);        //将从位置6到位置9的字符替换成MyReplace        [str replaceCharatersInRange:NSRange(6, 9) withString:@"MyReplace"];        NSLog(@"%@", str);    }}

时间与日期

日期与时间(NSDate)

#import <Foundation/Foundation.h>int main(int argh, char * argv[]){    @autoreleasepool    {        //获取当前日期、时间的NSDate        NSDate* date1 = [NSDate date];        NSLog(@"%@", date1);        //获取从当前时间开始一天后的日期、时间        NSDate* date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:3600*24];        NSLog(@"%@", date2);        //获取从当前时间开始三天之前的日期、时间        NSDate* date3 = [[NSDate alloc]         initWithTimeIntervalSinceNow:-3*3600*24];        NSLog(@"%@", date3);        //获全国1970年1月1日开始,20年之后的日期、时间        NSDate* date4 = [NSDate dateWithTimeIntervalSince1970:3600*24*366*20];        NSLog(@"%@", date4);        //获取系统当前的Locale        NSLocale* cn = [NSLocale currentLocale];        //获取 NSDate 在当前 Locale 下对应的字符串        NSLog(@“%@”, [date1 descrptionWithLocale:cn]);        //获取两个日期之间较早的日期        NSDate* earlier = [date1 earlierDate:date2];        //获取两个日期之间较晚的日期        NSDate* later = [date1 laterDate:date2];        /*用 compare: 方法比较两个日期并返回 NSComparisonResult 枚举值        枚举值包含 NSOrderedAscending NSOrderedSame NSOrderedDescending 三个值        分别代表调用者在参数值之前、相同、之后        */        switch([date1 compare:date3])        {            case NSOrderedAscending:                 NSLog(@"date1位于date3之前");                 breakcase NSOrderedSame:                 NSLog(@"date1与date3相同");                 break;            case NSOrderedDescending:                 NSLog(@"date1位于date3之后");                 break;        }        //获取两个时间之间的时间差,秒级别        NSLog(@"date1与date3之间的时间差%g秒",         [date1 timeIntervalSinceDate:date3]);        //获取制定时间与现在时间的差,秒级别        NSLog(@"date2与现在时间差%g秒",         [date2 timeIntervalSinceNow]);    }}

日期格式器(NSDateFormatter)

NSDateFormatter用于完成NSDate与NSString之间的转换。

  • NSDateFormatterNoStyle: 不显示日期、时间的风格
  • NSDateFormatterShortStyle: 显示短的日期、时间风格
    90-1-1 上午8:00
  • NSDateFormatterMediumStyle: 显示中等的日期、时间风格
    1990-1-16
  • NSDateFormatterLongStyle: 显示肠的日期、时间风格
    1990年1月16日 GMT+0800 上午8时00分00秒
  • NSDateFormatterFullStyle: 显示完整的日期、时间风格
    1990年1月16日 星期二 中国标准时间 上午 8时00分00秒
#import <Foundation/Foundationh>int main(int argh, char * arhv[]){    @autoreleasepool    {        //创建NSDate对象        NSDate* dt = [NSDate date];        //创建NSLocale        NSLocale* locale = [[NSLocale alloc]         nitWithLocaleIdentifier:@"zh_CN"];        //创建NSDateFormatter对象        NSDateFormar* df = [[NSDateFormatter alloc] init];        //设置 NSDateFormater的日期、时间风格        [df setDateStyle:NSDateFormatterShortStyle];        [df setTimeStyle:NSDateFormatterShortStyle];        //设置NSDateFormatter的NSLocale        [df setLocale:locale];        //以df的格式输出dt的日期值        NSLog(@"以 df 的格式输出 dt 的日期值为:%@", [df stringFromDate:dt]);        //创建DateFormaer对象,并设置自定义的格式器模板        NSDateFormatter* df2 = [[NSDateFoarmter alloc] init];        [df2 setDateFormat:@"公元yyyy年MM月DD日HH时mm分"];        //以 df2 的自定义格式输出 dt 的日期值        NSLog(@"以 df2 的自定义格式输出 dt 的日期值为:%@", [df2 tringFromDate:dt]);        //创建日期字符串        NSString* dateStr = @"2016-03-02";        NSDateFormatter* df3 = [[NSDateFormatter alloc] init];        //依据字符串的格式设置格式模板        [df3 setDateFormat:@"yyyy-MM-DD"];        //将字符串转化为NSDate对象        NSDate* date2 = [df3 dateFromString:dateStr];        NSLog(@"%@", date2);    }}

日历(NSCalendar)与日期组件(NSDateComponents)

NSDateComponents可以将个时间字段分别设置、获取,NSDate则是将各时间字段整合为一个整体,NSCalendar主要用于实现两者之间的转换,主要用以下两个方法来实现:

  • (NSDateComponents*)components:fromDate: 从NSDate对象提取年月日时分秒个时间字段信息
  • dateFromComponents:(NSDateComponents*) comps: 使用comps对象包含的年月日时分秒个时间字段信息来创建NSDate
#import <Foundation/Foundation.h>int main(int argh, char* argv[]){    @autoreleasepool    {        //获取代表公历的Calendar对象        NSCalendar *gregorian = [[NSCalendar alloc]         initWithCalendarIdentifier:NSGregorianCalendar];        //获取当前日期        NSDate* dt = [NSDate date];        //定义一时间字段的企标,指定将会获取的年月日时分秒信息        unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |         NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |         NSSecondCalendar | NSWeekdayCalendarUnit;        //获取不同时间字段信息        NSDateComponents* comp = [gregorian components:unnitFlags fromDate:dt];        //输出各时间字段        NSLog(@"现在时%ld年%ld月%ld日%ld时%ld分%ld秒%ld星期", comp.year,         comp.month, comp.day, comp.hour, comp.minute, comp.second,         comp.weekday);        //再次创建NSDateComponents对象        NSDateComponents* co2 = [[NSDateComponents alloc] init];        //设置各时间字段        comp2.year = 2016;        comp2.month = 4;        comp2.day = 5        comp2.hour = 18;        comp2.minute = 34;        //用 NSDateCompontents 来初始化 NSDate 对象        NSDate* dt2 =[gregorian dateFromCompontents:comp2];        NSLog(@"%@", dt2);    }}

定时器(NSTimer)

创建NSTimer对象用可用以下两种方法:

  • scheduledTimerWithTimeInterval:invocation:repeats:
  • scheduleTimerWithTimeInterval:target:selector:userInfo:repeat:

参数作用

  • timeInterval::指定每隔多少秒执行一次任务
  • invocation或 target &selector:指定重复执行的任务。
  • userInfo:额外的附加信息
  • repeat:指定一个BOOL值,控制是否需要重复执行任务
//启动一个定时器[NSTimer scheduleTimerWithTimeInterval:0.5target:self //指定以当前对象的 info: 方法作为执行任务selector:@selector(info:)userInfo:nilrepeat:YES];    //指定重复执行

上面代码中指定以当前对象的 info: 方法作为任务执行体,因此,程序还需要在该类中定义一个 info: 方法,该方法可定义一个 NSTimer 参数,该参数代表调度该任务的定时器。
增加的 info: 方法代码如下:

- (void) info:(NSTimer*) timer{    NSLog(@"正在执行第%d此任务", self.count++);    //如果count值大于10,取消定时器,count为类的一个自定义属性    if(self.count > 10)    {        NSLog(@"取消执行定时器");        [timer invalidate];    }}

对象复制

copy方法返回对象的 不可修改的副本,mutableCopy方法返回对象的可修改副本

自定义类的对象,为了保证可以调用copy方法和mutableCopy方法,通常需要:

  • 让该类实现NSCopying协议和copyWithZone方法
  • 让该类实现NSMutableCopying协议和mutableCopyWithZone方法

copyWithZone方法重写类似于下:

- (id) copyWithZone:(NSZone*) zone{    NSLog(@"--执行copyWithZone--");    /*    使用zone参数创建MyDog对象,若父类已实现了NSCopying协议,并且重写过copyWithZone:方法,那么子类重写copyWithZone:方法应该先调用父类的copy方法复制从父类继承得到的成员变量,然后再对子类中定义的成员变量进行赋值,如 MyDog* dog = [super copy];    */    MyDog* dog = [[[self class] alloc WithZone:zone] init];    //将源对象的name实例复制一个副本后赋值给新对象,这样就能实现深赋值    dog.name = [self.name mutableCopy];    dog.age = self.age;    return dog;}

数组(NSArray与NSMutableArray)

NSArray代表一个有序可重复的集合,每个元素都有对应的顺序索引,但不可修改,NSMutableArray与NSArray的区别在于它使可修改的。

创建NSArray的方法:

  • array 创建一个不包含任何元素的空NSArray
  • arrayWithContentsOfFile:/initWithContentsOfFile: 读取文件内容来创建NSArray
  • arrayWithPbject:/initWithObject: 创建包含指定元素的NSArray
  • arrayWithObjects:/initWithObjects: 创建指定N个元素的NSArray

下例示范了NSArray的方法:

#Import <Foundation/Foundation.h>int main(int argh, char * argv[]){    @autoreleasepool    {        NSArry* array = [NSArray arrayWithObjects:        @"孙悟空", @"猪八戒", @"沙和尚", @"白龙马", @"小龙女", nil];        NSLog(@"第一个元素:%@", [array objectAtIndex:0]);        NSLog(@"索引为1的元素:%@", [array objectAtIndex:1]);        NSLog(@"最后一个元素:%@", [array lastObject]);        //获取索引2-5的元素组成新的集合        NSArray* arr1 = [array objectAtIndexes:        [NSIndexSet indexSetWithIndexesInRange(2, 3)]];        NSLog(@"%@", arr1);        //获取元素在集合中的位置        NSLog(@"猪八戒的位置:%ld", [array indexOfObject:@"猪八戒"]);        //获取元素在集合指定范围中的位置        NSLog(@"在3-5范围中猪八戒的位置:%ld", [array indexOfObject:@"猪八戒"         inRang:NSMakeRange(3, 5)]);        //向数组后追加一个元素,不是修改原对象,而是新建对象再赋值        array = [array arrayByAddingObject:@"唐僧"];        //想数组后追加另一个数组所有元素        array = [array arrayByAddingObjectsFromArray:        [NSArray arrayWithObjects:@"如来", @"玉帝", nil]];        for(int i = 0; i < array.count; i++)        {            NSLog(@"%@", [array objectAtIndex:i]);            /*上面代码也可简写成:            NSLog(@"%@", array[i]);   */        }        //获取array中索引3-5        NSArray* arr2 = [array subarrayWithRange:NSMakeRange(3, 5)];        //将数组写入文件        [arr2 writeToFile:@"myFile.txt" atomically:YES];    }}

NSArray方法

集合所有元素调用方法:

  • makeObjectsPerformSelector: 集合每个元素依次调用指定方法
  • makeObjectsPerformSelector:withObject: 集合每个元素携带参数依次调用指定方法

集合元素进行隐式遍历,并依次执行一段代码块:

  • enumerateObjectsUsingBlock:
  • enumerateObjectsWithOptions:usingBlock:
  • enumreateObjectsAtIndexes:options:usingBlock:
#import <Foundation/Foundation.h>int main(int argh, char * argv[]){    @autoreleasepool    {        NSArry* array = [NSArray arrayWithObjects:        [[MyUser alloc] initWithName:@"sun" pass:"123"],         [[MyUser alloc] initWithName:@"bai" pass:@"345"],         [[MyUser alloc] initWithName:@"zhu" pass:@"654"],         [[MyUser alloc] initWithName:@"tang" pass:@"178"],         [[MyUser alloc] initWithName:@"niu" pass:@"155"],         nil];        //对集合元素整体调用方法        [array makeObjectsPerformSelector:@seletor(say:)         withObject:@"Hello,World!"];        //集合内指定范围元素来执行代码块        [array  enumerateObjectsAtIndexes:        [NSIndexSet indexSetWithIndexesInRange:NSMakeRange()2, 3]         options:NSEnumreationReverse        usingBlock: ^(id obj, NSUInteger idx, BOOL *stop)        {            NSLog(@"正在处理第%ld个元素:%@", idx, obj);            [obj say:@"执行代码块"];        }]    }}

对NSArray进那个排序

  • sortedArrayUsingFunction:context: 用排序函数进行排序,函数必须返回NSOrderedDescending、NSOderedAscending、NSOrderedSame这些枚举值,返回一个排好序的NSArray对象
  • sortedArrayUsingSlector:用自身方法进行排序,方法必须返回NSOrderedDescending、NSOderedAscending、NSOrderedSame这些枚举值,返回一个排好序的NSArray对象
  • sortedArrayUsingComparator:用代码块进行排序,代码块必须返回NSOrderedDescending、NSOderedAscending、NSOrderedSame这些枚举值,返回一个排好序的NSArray对象

使用枚举器(NSEnumerator)遍历NSArray集合

用NSArray以下两方法来返回枚举器(NSEnumerator):

  • objectEnumerator 返回NSArray集合的顺序枚举器
  • reverseObjectEnumerator 返回NSArray集合的逆序枚举器

枚举器(NSEnumerator)包含如下两方法:

  • allObjects
  • nextobjext
    一般借助 nextObject 方法即可对元素集合进行枚举,采用循环不断获取 nextObject 方法的返回值,知道该方法的返回值为nil结束循环
NSEnumerator* en [array objectEnumerator];id object;while(object = [en nextObject]){    NSLog(@"%@", object);}

快速枚举(for(… in …))

for(id object in array){    BSLog(@"%@", object);}

可变数组(NSMutableArray)

NSMutableArray为NSArray的一个子集,比NSArray多出了对元素进行操作(添加、删除、替换、排序)的方法:

[array add object:@"观音"];[array addObjectsFromArray:arr1];[array insertObject:@"燃灯" atIndex:2];[array insertObjects:[NSArray arrayWithObjects:@"伏虎", @"降龙", nil] atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(3, 2)]];[array removeLastObject];[array removeObjectAtIndex:5];[array removeObjectsInRange:NSMakeRange(3, 2)];[array replaceObjectAtIndex:2 withObject:@"太白"];

NSArray的KVC与KVO

  • setValue:forKey: 将NSArray中所有元素指定key的属性设置为value
  • valueForKey: 返回NSArray所有元素指定key的属性组成的NSArray
  • addObserver:forKeyPath:options:context: 为NSArray所有元素添加KVO监听器
  • removeObserver:forKeyPath: 删除NSArray所有元素的KVO监听器
  • addObserver:toObjectsAtIndexes:forKeyPath:options:context: 为NSArray指定范围的元素添加KVO监听器
  • removeObserver:fromObjectsAtIndexes:forKeyPath: 删除NSArray指定范围元素的KVO监听器

集合(NSSet和NSMutableSet)

与NSArray相似点:

  • 通过count方法获取元素数量
  • 快速枚举
  • 通过objectEnmuerator方法来获取枚举器,病用枚举器遍历集合
  • makeObjectsPerformSelector:、makeObjectsPerformSelector:withObject:
  • enumerateObjectsUsingBlock:、enumerateObjectsWithOptions:UseingBlock:
  • KVC和KVO

之外的方法:

  • setByAddingObject: 向集合追加一个新元素,并返回新集合
  • setByAddingObjectsFromSet: 向集合追加多个新元素,并返回新集合
  • setByAddingObjectsFromArray: 向集合追加NSArray集合中的所有元素,并返回新集合
  • allObjects: 返回集合中所有元素组成的NSArray
  • anyObject: 返回集合中非随机某个元素
  • containObject: 判断是否包含指定元素 BOOL
  • member:判断该集合是否包含与该参数相等的元素,包含则返回元素,不包含则返回nil
  • objectsPassingTest: 需要传入一个代码块对集合过滤,保留满足条件(return BOOL值为YES)的元素组成新的NSSet并返回
  • objectsWithOptions:passingTest:与前一个方法相似,多一个可传入NSEnumerationOptions参数
  • isSubsetOfSet:判断当前集合是否为另一个集合的子集 BOOL
  • intersectsSet: 判断两个集合是否有交集 BOOL
  • isEqualToSet: 判断两个集合的元素是否相等

判断存入NSSet中两个元素相等的标准:

  • 两个对象通过 isEqual: 方法比较返回YES
  • 两个对象的hash方法返回值也相等

重写hash方法的注意点:

  • 同一对象多次调用hash方法应该返回值相同
  • 两个对象通过 isEqual: 方法返回YES时,这两个对象的 hash 方法应返回相等的值
  • 对象中作为 isEqual: 标准的实例变量,都应该用来计算 hashCode值

重写hash方法的一般步骤:

  • 把对象内每个用作 isEqual: 比较标准的实例变量都计算出一个int类型的hasCode值
  • 把上一步计算出来的多个 hashCode 值组合计算出一个hashCode值病返回,此处为避免偶然相等,可通过将个实例变量的hashCode值乘以任意质数再相加

NSMutableSet的功能与用法

NSMutableSet继承于NSSet,代表一个元素可变的NSSet集合,因此创建NSMutableSet时可以指定底层Hash表的初始容量

NSMutableSet set = [NSMutableSet setWithCapacity:10];

增加的元素操作方法:

  • addObject: 追加一个元素
  • removeObject: 删除一个元素
  • removeAllObjects: 删除所有元素
  • addObjectsFromArray: 追加NSArray中的所有元素
  • unionSet: 计算两个集合的并集
  • minusSet:计算两个集合的差集
  • intersectSet:计算两个集合的交集
  • setSet: 用后一个集合元素替换已有集合中的所有元素

NSCountedSet的功能与用法

NSCountedSet是NSMutableSet得子类,比之会额外维护一个添加次数的状态,多次添加相同元素,添加次数会+1,多次删除相同元素。添加次数会-1,当元素的添加次数为0时,该元素才会真正的被删除,可通过如下方法获取指定元素的添加次数:

[set countForObject:@”燃灯”];

有序集合(NSOrderedSet与NSMutableOrderedSet)

具有类似于NSArray和NSSet的功能:

  • 不允许元素重复
  • 可以保持元素添加的顺序,且每个元素均有索引,可依据索引来操作元素

字典(NSDictionary与NSMutableDictionary)

NSDictionary的功能与用法

NSDictionary由多组key-value对组成,key与value可以是任意引用类型的数据,key不允许重复。

创建NSDictionary对象的常见方法:

  • dictionary 创建一个不包含任何key-value对的NSDictionary
  • dictionaryWithContentsOfFile:/initWithContentsOfFile: 读取指定文件的内容来初始化NSDictionary
  • dictionaryWithDictionary:/initWithDictionary: 使用已有的NSDictionary包含的key-value对来初始化NSDictiionary对象
  • dictionaryWithObject:forKey: 使用单个key-value对来创建NSDictionary对象
  • dictionaryWithObjects:forKeys:/initWithObjects:forKeys: 使用两个NSArray分别指定为key、value集合,创建多组key-value对的NSDictionary对象
  • dictionaryWithObjectsAndKeys:/initWithObjectsAndKeys: 按 value1,key1,value2,key2,….nil的格式传值,创建多组key-value对的NSDictionary对象

NSDictionary常用的方法:

  • count 返回key-value对的数量
  • allKeys 返回全部的key
  • allKeysForObject: 返回指定value的全部key
  • allValues 返回全部的value
  • objectForKey: 返回指定key的value
  • objectForKeyedSubscript: 支持通过下角标方式获取指定key对应的value
  • valueForKey:返货指定key的value
  • keyEnumerator 返回所有key的NSEnumerator对象
  • objectEnumerator 返回所有value的NSEnumerator对象
  • enmuerateKeysAndObjectsUsingBlock: 使用指定代码块来执行所有的key-value对
  • enumerateKeysAndObjectsWithOptions:usingBlock: 较之上个方法多个NSEnumerationOptions参数
  • writeToFile:atomically: 写入指定文件

对NSDictionary的key排序

  • keysSortedByValueUsingSelector: 依据NSDictionary 的所有value的制定方法的返回值对key排序,该方法必须返回 NSOrederedAscending、NSOrederedDescending、NSOrederedSame 三个值之一
  • keysSortedByValueUsingComparator: 该方法使用指定的代码块来遍历 key-value 对,病依据执行结果(NSOrederedAscending、NSOrederedDescending、NSOrederedSame )对key排序。
  • keysSortedByValueWithOptions:usingComparator: 与前一个方法类似,只是多了一个NSEnumerationOption参数

对 NSDictionary的kry进行过滤

  • keysOfEntriesPassTest: 使用代码块迭代处理 NSDictionary 的每一个key- value 对,代码块需返回 BOOL 值,返回为 YES 时才会被保留,代码块可接受三个参数,key、value、BOOL变量,BOOL变量为NO则会立即停止迭代
  • keysOfEntriesWithOptions:passingTest: 与前一个方法类似,多一个 NSEnumerationOptions 参数

用自定义类作为NSDictionary的key

自定义类需满足以下要求:

  • 正确重写过 isEqual: 和 hash 方法
  • 实现了 copyWithZone: 方法,该方法最好能返回对象的不可变副本

NSMutableDictionary的功能与用法

NSMutableDictionary继承自NSDictionary,代表一个key-value可变的NSDictionary集合,因此创建NSMutableDictionary时可以指定初始容量。

  • setObject:forKey: 设置一个key-value对,若已存在,则会进行替换
  • setObject:forKeyedSubscript: 支持下标来设置key-value对
  • addEntriesFromDictionary:将另一个NSDictionary中的所有key-value对复制到当前集合中
  • setDictionary:用另一个NSDictionary中素有的key-value对替换当前的集合
  • removeObjectForKey: 删除指定key的key-value对
  • removeAllObjects: 清空集合
  • removeObjectsForKeys: 使用多个key组成的NSArray作为参数,删除指定的多个key的key-value对

谓词

定义谓词

谓词用NSPredicate来代表,实际编程时会直接用 predicateWithFormat: 方法,并以谓词字符串为参数来创建对象。

NSPredicate* pred = [NSPredicate predicateWithFormat:@”name like ‘s*’ “];

如果为此中有占位符参数,则需要:

  • 用谓词的predicateWithSubstitutionVariables: 方法为占位符参数设置参数值
  • 执行谓词的 evaluateWithObject: 方法计算谓词的返回结果
    ps:evaluateWithObject:substitutionVariables: 方法可以同时完成上面两步

使用谓词过滤集合

NSArray和NSMutableArray中提供了如下方法来使用谓词进行过滤:

  • (NSArray*)filteredArrayUsingPredicate:(NSPredicate*)predicate: 使用指定的谓词过滤NSArray集合,返回复合条件的元素组成的新集合
  • (void)filterUsingPredicate:(NSPredicate*)predicate: 使用指定的谓词过滤NSMutableArray集合,剔除不符合的元素

NSSet和NSMutableSet提供了如下方法来使用谓词进行过滤:

  • (NSSet*)filteredSetUsingPredicate:(NSPredicate*)predicate: 用指定的谓词过滤NSSet集合,返回复合条件元素组成的新集合
  • (void)filterUsingPredicate:(NSPredicate*)predicate: 使用指定的谓词过滤NSMutableSet机关和,剔除不符合的元素

在谓词中使用占位符参数

谓词表达式中支持一下两个占位符参数:

  1. %K 动态传入属性名
  2. %@ 动态传入属性值
    ps:除此之外,还可以在谓词表达式中使用童泰改变的属性值,类似于环境变量 $SUBSTR
//set为集合,代码省略NSSet* set = [NSSet setWithObjects:[[MyUser alloc] initWithName:@"孙悟空" pass:@"343"], ...];NSString* prepPath = @"name";NSString* vaule= @"孙悟空";//创建谓词,含有两个占位符,后面两个变量用于为占位符设置参数NSPredicate* pred = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", propPath, value];NSSet* newSet = [set filteredSetUsingPredicate:pred];//创建谓词,使用可动态改变的子串,%K占位符使用pass代替NSPredicate* predTemplate = [NSPredicate predicateWithFormat:@"%K CONTAINS $WUBSTR", @"pass"]//使用NSDiictionary指定$SUBSTR的值为343NSPredicate pared = [predTemplate predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:@"343", @"SUBSTR", nil]];NSSet nesSet2 = [set filteredSetUsingPredicate:pred2];

谓词表达式的语法

基本的比较运算符

  • = ==
  • => >=
  • =< <=
  • >
  • <
  • != <> 不相等

基本的逻辑运算符

  • AND &&
  • OR ||
  • NOT !

字符串比较运算符

  • BEGINSWITH
  • ENDSWITH
  • CONTAINS
  • LIKE
  • MATCHES

PS:比较运算符是区分大小写和重音符号的,若想不进行区分,可用[c]不区分大小写、[d]不区分中银符号来进行修饰。

name CONTAINS[cd] ‘jkl’

操作集合的运算符

  • ANY SOME
  • ALL
  • NONE
  • IN name IN { ‘Ben’, ‘Mel’, ‘Nike’ }
  • array[index]
  • array[FIRST]
  • array[LAST]
  • array[SIZE] 返回集合的元素个数

直接量

  • FALSE NO
  • TRUE YES
  • NULL NIL
  • SELF
  • ‘text’ “text” 代表字符串
  • 数组
  • 数值
  • 2、8、16进制数,分别以0b/0o/0x开头

保留字

AND、OR、IN、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE

0 0