abstract:字符串(NSString與NSMutableString)創(chuàng)建字符串int main(int argh, char * argv[]) { @autoreleasepool { &nb
字符串(NSString與NSMutableString)
創(chuàng)建字符串
int main(int argh, char * argv[]) { @autoreleasepool { //定義unichar數(shù)組,該數(shù)組是個基本類型,就是unsigned short的別名 unichar data[6] = {1, 2, 3, 4, 5, 6}; //使用Unicode數(shù)值數(shù)組初始化字符串 NSString* str = [[NSString alloc] initWithCharacters:data length:6]; NSLog(@"%@", str); char* caster = "Heloo, IOS!"; //將c風格字符串轉(zhuǎn)化為NSString對象 NSString* str2 = [NSString stringWithUTF8String:cstr]; NSLog(@"%@", str2); //將字符串寫入制定文件 [str2 writeToFile:@"myFile.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; //讀取文件內(nèi)容,用文件內(nèi)容初始化字符串 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); //獲取字符串對應(yīng)的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字符集解碼后的字節(jié)數(shù)為:%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 中出現(xiàn)的位置 NSRange pos = [str rangeOfString:@"IOS"]; NSLog(@"IOS 在 str 中出現(xiàn)的開始位置是:%ld ,長度為:%ld", pos.location, pos.length); //將 str 中的字符轉(zhuǎn)為大寫 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 = @"《西游記》"; //創(chuàng)建一個 NSMutableString 對象 NSMutableString* str = [NSMutableString stringWithString:@"Hello"]; //追加固定字符串,由于是字符串包含的字符序列發(fā)生了改變,因此無需重新賦值 [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); //獲取系統(tǒng)當前的Locale NSLocale* cn = [NSLocale currentLocale]; //獲取 NSDate 在當前 Locale 下對應(yīng)的字符串 NSLog(@“%@”, [date1 descrptionWithLocale:cn]); //獲取兩個日期之間較早的日期 NSDate* earlier = [date1 earlierDate:date2]; //獲取兩個日期之間較晚的日期 NSDate* later = [date1 laterDate:date2]; /*用 compare: 方法比較兩個日期并返回 NSComparisonResult 枚舉值 枚舉值包含 NSOrderedAscending NSOrderedSame NSOrderedDescending 三個值 分別代表調(diào)用者在參數(shù)值之前、相同、之后 */ switch([date1 compare:date3]) { case NSOrderedAscending: NSLog(@"date1位于date3之前"); break; case NSOrderedSame: NSLog(@"date1與date3相同"); break; case NSOrderedDescending: NSLog(@"date1位于date3之后"); break; } //獲取兩個時間之間的時間差,秒級別 NSLog(@"date1與date3之間的時間差%g秒", [date1 timeIntervalSinceDate:date3]); //獲取制定時間與現(xiàn)在時間的差,秒級別 NSLog(@"date2與現(xiàn)在時間差%g秒", [date2 timeIntervalSinceNow]); } }
日期格式器(NSDateFormatter)
NSDateFormatter用于完成NSDate與NSString之間的轉(zhuǎn)換。
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 { //創(chuàng)建NSDate對象 NSDate* dt = [NSDate date]; //創(chuàng)建NSLocale NSLocale* locale = [[NSLocale alloc] nitWithLocaleIdentifier:@"zh_CN"]; //創(chuàng)建NSDateFormatter對象 NSDateFormar* df = [[NSDateFormatter alloc] init]; //設(shè)置 NSDateFormater的日期、時間風格 [df setDateStyle:NSDateFormatterShortStyle]; [df setTimeStyle:NSDateFormatterShortStyle]; //設(shè)置NSDateFormatter的NSLocale [df setLocale:locale]; //以df的格式輸出dt的日期值 NSLog(@"以 df 的格式輸出 dt 的日期值為:%@", [df stringFromDate:dt]); //創(chuàng)建DateFormaer對象,并設(shè)置自定義的格式器模板 NSDateFormatter* df2 = [[NSDateFoarmter alloc] init]; [df2 setDateFormat:@"公元yyyy年MM月DD日HH時mm分"]; //以 df2 的自定義格式輸出 dt 的日期值 NSLog(@"以 df2 的自定義格式輸出 dt 的日期值為:%@", [df2 tringFromDate:dt]); //創(chuàng)建日期字符串 NSString* dateStr = @"2016-03-02"; NSDateFormatter* df3 = [[NSDateFormatter alloc] init]; //依據(jù)字符串的格式設(shè)置格式模板 [df3 setDateFormat:@"yyyy-MM-DD"]; //將字符串轉(zhuǎn)化為NSDate對象 NSDate* date2 = [df3 dateFromString:dateStr]; NSLog(@"%@", date2); } }
日歷(NSCalendar)與日期組件(NSDateComponents)
NSDateComponents可以將個時間字段分別設(shè)置、獲取,NSDate則是將各時間字段整合為一個整體,NSCalendar主要用于實現(xiàn)兩者之間的轉(zhuǎn)換,主要用以下兩個方法來實現(xiàn):
(NSDateComponents*)components:fromDate: 從NSDate對象提取年月日時分秒個時間字段信息
dateFromComponents:(NSDateComponents*) comps: 使用comps對象包含的年月日時分秒個時間字段信息來創(chuàng)建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(@"現(xiàn)在時%ld年%ld月%ld日%ld時%ld分%ld秒%ld星期", comp.year, comp.month, comp.day, comp.hour, comp.minute, comp.second, comp.weekday); //再次創(chuàng)建NSDateComponents對象 NSDateComponents* co2 = [[NSDateComponents alloc] init]; //設(shè)置各時間字段 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)
創(chuàng)建NSTimer對象用可用以下兩種方法:
scheduledTimerWithTimeInterval:invocation:repeats:
scheduleTimerWithTimeInterval:target:SELECTor:userInfo:repeat:
參數(shù)作用
timeInterval::指定每隔多少秒執(zhí)行一次任務(wù)
invocation或 target &SELECTor:指定重復(fù)執(zhí)行的任務(wù)。
userInfo:額外的附加信息
repeat:指定一個BOOL值,控制是否需要重復(fù)執(zhí)行任務(wù)
//啟動一個定時器[NSTimer scheduleTimerWithTimeInterval:0.5target:self //指定以當前對象的 info: 方法作為執(zhí)行任務(wù)SELECTor:@SELECTor(info:) userInfo:nilrepeat:YES]; //指定重復(fù)執(zhí)行
上面代碼中指定以當前對象的 info: 方法作為任務(wù)執(zhí)行體,因此,程序還需要在該類中定義一個 info: 方法,該方法可定義一個 NSTimer 參數(shù),該參數(shù)代表調(diào)度該任務(wù)的定時器。
增加的 info: 方法代碼如下:
- (void) info:(NSTimer*) timer { NSLog(@"正在執(zhí)行第%d此任務(wù)", self.count++); //如果count值大于10,取消定時器,count為類的一個自定義屬性 if(self.count > 10) { NSLog(@"取消執(zhí)行定時器"); [timer invalidate]; } }
對象復(fù)制
copy方法返回對象的 不可修改的副本,mutableCopy方法返回對象的可修改副本
自定義類的對象,為了保證可以調(diào)用copy方法和mutableCopy方法,通常需要:
讓該類實現(xiàn)NSCopying協(xié)議和copyWithZone方法
讓該類實現(xiàn)NSMutableCopying協(xié)議和mutableCopyWithZone方法
copyWithZone方法重寫類似于下:
- (id) copyWithZone:(NSZone*) zone { NSLog(@"--執(zhí)行copyWithZone--"); /* 使用zone參數(shù)創(chuàng)建MyDog對象,若父類已實現(xiàn)了NSCopying協(xié)議,并且重寫過copyWithZone:方法,那么子類重寫copyWithZone:方法應(yīng)該先調(diào)用父類的copy方法復(fù)制從父類繼承得到的成員變量,然后再對子類中定義的成員變量進行賦值,如 MyDog* dog = [super copy]; */ MyDog* dog = [[[self class] alloc WithZone:zone] init]; //將源對象的name實例復(fù)制一個副本后賦值給新對象,這樣就能實現(xiàn)深賦值 dog.name = [self.name mutableCopy]; dog.age = self.age; return dog; }
數(shù)組(NSArray與NSMutableArray)
NSArray代表一個有序可重復(fù)的集合,每個元素都有對應(yīng)的順序索引,但不可修改,NSMutableArray與NSArray的區(qū)別在于它使可修改的。
創(chuàng)建NSArray的方法:
array 創(chuàng)建一個不包含任何元素的空NSArray
arrayWithContentsOfFile:/initWithContentsOfFile: 讀取文件內(nèi)容來創(chuàng)建NSArray
arrayWithPbject:/initWithObject: 創(chuàng)建包含指定元素的NSArray
arrayWithObjects:/initWithObjects: 創(chuàng)建指定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)]); //向數(shù)組后追加一個元素,不是修改原對象,而是新建對象再賦值 array = [array arrayByAddingObject:@"唐僧"]; //想數(shù)組后追加另一個數(shù)組所有元素 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)]; //將數(shù)組寫入文件 [arr2 writeToFile:@"myFile.txt" atomically:YES]; } }
NSArray方法
集合所有元素調(diào)用方法:
makeObjectsPerformSelector: 集合每個元素依次調(diào)用指定方法
makeObjectsPerformSelector:withObject: 集合每個元素攜帶參數(shù)依次調(diào)用指定方法
集合元素進行隱式遍歷,并依次執(zhí)行一段代碼塊:
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]; //對集合元素整體調(diào)用方法 [array makeObjectsPerformSelector:@seletor(say:) withObject:@"Hello,World!"]; //集合內(nèi)指定范圍元素來執(zhí)行代碼塊 [array enumerateObjectsAtIndexes: [NSIndexSet indexSetWithIndexesInRange:NSMakeRange()2, 3] options:NSEnumreationReverse usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"正在處理第%ld個元素:%@", idx, obj); [obj say:@"執(zhí)行代碼塊"]; }] } }
對NSArray進那個排序
sortedArrayUsingFunction:context: 用排序函數(shù)進行排序,函數(shù)必須返回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 方法即可對元素集合進行枚舉,采用循環(huán)不斷獲取 nextObject 方法的返回值,知道該方法的返回值為nil結(jié)束循環(huán)
NSEnumerator* en [array objectEnumerator]; id object;while(object = [en nextObject]){ NSLog(@"%@", object); }
快速枚舉(for(… in …))
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的屬性設(shè)置為value
valueForKey: 返回NSArray所有元素指定key的屬性組成的NSArray
addObserver:forKeyPath:options:context: 為NSArray所有元素添加KVO監(jiān)聽器
removeObserver:forKeyPath: 刪除NSArray所有元素的KVO監(jiān)聽器
addObserver:toObjectsAtIndexes:forKeyPath:options:context: 為NSArray指定范圍的元素添加KVO監(jiān)聽器
removeObserver:fromObjectsAtIndexes:forKeyPath: 刪除NSArray指定范圍元素的KVO監(jiān)聽器
集合(NSSet和NSMutableSet)
與NSArray相似點:
通過count方法獲取元素數(shù)量
快速枚舉
通過objectEnmuerator方法來獲取枚舉器,病用枚舉器遍歷集合
makeObjectsPerformSelector:、makeObjectsPerformSelector:withObject:
enumerateObjectsUsingBlock:、enumerateObjectsWithOptions:UseingBlock:
KVC和KVO
之外的方法:
setByAddingObject: 向集合追加一個新元素,并返回新集合
setByAddingObjectsFromSet: 向集合追加多個新元素,并返回新集合
setByAddingObjectsFromArray: 向集合追加NSArray集合中的所有元素,并返回新集合
allObjects: 返回集合中所有元素組成的NSArray
anyObject: 返回集合中非隨機某個元素
containObject: 判斷是否包含指定元素 BOOL
member:判斷該集合是否包含與該參數(shù)相等的元素,包含則返回元素,不包含則返回nil
objectsPassingTest: 需要傳入一個代碼塊對集合過濾,保留滿足條件(return BOOL值為YES)的元素組成新的NSSet并返回
objectsWithOptions:passingTest:與前一個方法相似,多一個可傳入NSEnumerationOptions參數(shù)
isSubsetOfSet:判斷當前集合是否為另一個集合的子集 BOOL
intersectsSet: 判斷兩個集合是否有交集 BOOL
isEqualToSet: 判斷兩個集合的元素是否相等
判斷存入NSSet中兩個元素相等的標準:
兩個對象通過 isEqual: 方法比較返回YES
兩個對象的hash方法返回值也相等
重寫hash方法的注意點:
同一對象多次調(diào)用hash方法應(yīng)該返回值相同
兩個對象通過 isEqual: 方法返回YES時,這兩個對象的 hash 方法應(yīng)返回相等的值
對象中作為 isEqual: 標準的實例變量,都應(yīng)該用來計算 hashCode值
重寫hash方法的一般步驟:
把對象內(nèi)每個用作 isEqual: 比較標準的實例變量都計算出一個int類型的hasCode值
把上一步計算出來的多個 hashCode 值組合計算出一個hashCode值病返回,此處為避免偶然相等,可通過將個實例變量的hashCode值乘以任意質(zhì)數(shù)再相加
NSMutableSet的功能與用法
NSMutableSet繼承于NSSet,代表一個元素可變的NSSet集合,因此創(chuàng)建NSMutableSet時可以指定底層Hash表的初始容量
NSMutableSet set = [NSMutableSet setWithCapacity:10];
增加的元素操作方法:
addObject: 追加一個元素
removeObject: 刪除一個元素
removeAllObjects: 刪除所有元素
addObjectsFromArray: 追加NSArray中的所有元素
unionSet: 計算兩個集合的并集
minusSet:計算兩個集合的差集
intersectSet:計算兩個集合的交集
setSet: 用后一個集合元素替換已有集合中的所有元素
NSCountedSet的功能與用法
NSCountedSet是NSMutableSet得子類,比之會額外維護一個添加次數(shù)的狀態(tài),多次添加相同元素,添加次數(shù)會+1,多次刪除相同元素。添加次數(shù)會-1,當元素的添加次數(shù)為0時,該元素才會真正的被刪除,可通過如下方法獲取指定元素的添加次數(shù):
[set countForObject:@”燃燈”];
有序集合(NSOrderedSet與NSMutableOrderedSet)
具有類似于NSArray和NSSet的功能:
不允許元素重復(fù)
可以保持元素添加的順序,且每個元素均有索引,可依據(jù)索引來操作元素
字典(NSDictionary與NSMutableDictionary)
NSDictionary的功能與用法
NSDictionary由多組key-value對組成,key與value可以是任意引用類型的數(shù)據(jù),key不允許重復(fù)。
創(chuàng)建NSDictionary對象的常見方法:
dictionary 創(chuàng)建一個不包含任何key-value對的NSDictionary
dictionaryWithContentsOfFile:/initWithContentsOfFile: 讀取指定文件的內(nèi)容來初始化NSDictionary
dictionaryWithDictionary:/initWithDictionary: 使用已有的NSDictionary包含的key-value對來初始化NSDictiionary對象
dictionaryWithObject:forKey: 使用單個key-value對來創(chuàng)建NSDictionary對象
dictionaryWithObjects:forKeys:/initWithObjects:forKeys: 使用兩個NSArray分別指定為key、value集合,創(chuàng)建多組key-value對的NSDictionary對象
dictionaryWithObjectsAndKeys:/initWithObjectsAndKeys: 按 value1,key1,value2,key2,….nil的格式傳值,創(chuàng)建多組key-value對的NSDictionary對象
NSDictionary常用的方法:
count 返回key-value對的數(shù)量
allKeys 返回全部的key
allKeysForObject: 返回指定value的全部key
allValues 返回全部的value
objectForKey: 返回指定key的value
objectForKeyedSubscript: 支持通過下角標方式獲取指定key對應(yīng)的value
valueForKey:返貨指定key的value
keyEnumerator 返回所有key的NSEnumerator對象
objectEnumerator 返回所有value的NSEnumerator對象
enmuerateKeysAndObjectsUsingBlock: 使用指定代碼塊來執(zhí)行所有的key-value對
enumerateKeysAndObjectsWithOptions:usingBlock: 較之上個方法多個NSEnumerationOptions參數(shù)
writeToFile:atomically: 寫入指定文件
對NSDictionary的key排序
keysSortedByValueUsingSelector: 依據(jù)NSDictionary 的所有value的制定方法的返回值對key排序,該方法必須返回 NSOrederedAscending、NSOrederedDescending、NSOrederedSame 三個值之一
keysSortedByValueUsingComparator: 該方法使用指定的代碼塊來遍歷 key-value 對,病依據(jù)執(zhí)行結(jié)果(NSOrederedAscending、NSOrederedDescending、NSOrederedSame )對key排序。
keysSortedByValueWithOptions:usingComparator: 與前一個方法類似,只是多了一個NSEnumerationOption參數(shù)
對 NSDictionary的kry進行過濾
keysOfEntriesPassTest: 使用代碼塊迭代處理 NSDictionary 的每一個key- value 對,代碼塊需返回 BOOL 值,返回為 YES 時才會被保留,代碼塊可接受三個參數(shù),key、value、BOOL變量,BOOL變量為NO則會立即停止迭代
keysOfEntriesWithOptions:passingTest: 與前一個方法類似,多一個 NSEnumerationOptions 參數(shù)
用自定義類作為NSDictionary的key
自定義類需滿足以下要求:
正確重寫過 isEqual: 和 hash 方法
實現(xiàn)了 copyWithZone: 方法,該方法最好能返回對象的不可變副本
NSMutableDictionary的功能與用法
NSMutableDictionary繼承自NSDictionary,代表一個key-value可變的NSDictionary集合,因此創(chuàng)建NSMutableDictionary時可以指定初始容量。
setObject:forKey: 設(shè)置一個key-value對,若已存在,則會進行替換
setObject:forKeyedSubscript: 支持下標來設(shè)置key-value對
addEntriesFromDictionary:將另一個NSDictionary中的所有key-value對復(fù)制到當前集合中
setDictionary:用另一個NSDictionary中素有的key-value對替換當前的集合
removeObjectForKey: 刪除指定key的key-value對
removeAllObjects: 清空集合
removeObjectsForKeys: 使用多個key組成的NSArray作為參數(shù),刪除指定的多個key的key-value對
謂詞
定義謂詞
謂詞用NSPredicate來代表,實際編程時會直接用 predicateWithFormat: 方法,并以謂詞字符串為參數(shù)來創(chuàng)建對象。
NSPredicate* pred = [NSPredicate predicateWithFormat:@”name like ‘s*’ “];
如果為此中有占位符參數(shù),則需要:
用謂詞的predicateWithSubstitutionVariables: 方法為占位符參數(shù)設(shè)置參數(shù)值
執(zhí)行謂詞的 evaluateWithObject: 方法計算謂詞的返回結(jié)果
ps:evaluateWithObject:substitutionVariables: 方法可以同時完成上面兩步
使用謂詞過濾集合
NSArray和NSMutableArray中提供了如下方法來使用謂詞進行過濾:
(NSArray*)filteredArrayUsingPredicate:(NSPredicate*)predicate: 使用指定的謂詞過濾NSArray集合,返回復(fù)合條件的元素組成的新集合
(void)filterUsingPredicate:(NSPredicate*)predicate: 使用指定的謂詞過濾NSMutableArray集合,剔除不符合的元素
NSSet和NSMutableSet提供了如下方法來使用謂詞進行過濾:
(NSSet*)filteredSetUsingPredicate:(NSPredicate*)predicate: 用指定的謂詞過濾NSSet集合,返回復(fù)合條件元素組成的新集合
(void)filterUsingPredicate:(NSPredicate*)predicate: 使用指定的謂詞過濾NSMutableSet機關(guān)和,剔除不符合的元素
在謂詞中使用占位符參數(shù)
謂詞表達式中支持一下兩個占位符參數(shù):
%K 動態(tài)傳入屬性名
%@ 動態(tài)傳入屬性值
ps:除此之外,還可以在謂詞表達式中使用童泰改變的屬性值,類似于環(huán)境變量 $SUBSTR
//set為集合,代碼省略 NSSet* set = [NSSet setWithObjects: [[MyUser alloc] initWithName:@"孫悟空" pass:@"343"], ...]; NSString* prepPath = @"name"; NSString* vaule= @"孫悟空"; //創(chuàng)建謂詞,含有兩個占位符,后面兩個變量用于為占位符設(shè)置參數(shù) NSPredicate* pred = [NSPredicate predicateWithFormat: @"%K CONTAINS %@", propPath, value]; NSSet* newSet = [set filteredSetUsingPredicate:pred]; //創(chuàng)建謂詞,使用可動態(tài)改變的子串,%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:比較運算符是區(qū)分大小寫和重音符號的,若想不進行區(qū)分,可用[c]不區(qū)分大小寫、[d]不區(qū)分中銀符號來進行修飾。
name CONTAINS[cd] ‘jkl’
操作集合的運算符
ANY SOME
ALL
NONE
IN name IN { ‘Ben’, ‘Mel’, ‘Nike’ }
array[index]
array[FIRST]
array[LAST]
array[SIZE] 返回集合的元素個數(shù)
直接量
FALSE NO
TRUE YES
NULL NIL
SELF
‘text’ “text” 代表字符串
數(shù)組
數(shù)值
2、8、16進制數(shù),分別以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