KVC集合操作符

第一次遇到是在閱讀AFNetworking中NSURLSession部分代碼的時(shí)候:

- (NSArray *)tasksForKeyPath:(NSString *)keyPath {
 
    __block NSArray *tasks = nil;
 
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
 
    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks,
     NSArray *uploadTasks, NSArray *downloadTasks) {
 
        if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))
        ]) {
 
            tasks = dataTasks;
 
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
            uploadTasks))]) {
 
            tasks = uploadTasks;
 
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
            downloadTasks))]) {
 
            tasks = downloadTasks;
 
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
            tasks))]) {
             
            //dataTasks, uploadTasks, downloadTasks 都是數(shù)組,相當(dāng)于打平數(shù)組,返回一個(gè)包含子數(shù)組各元素的數(shù)組。
            tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:
            @"@unionOfArrays.self"];
        }
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    return tasks;
 
}

KVC集合運(yùn)算符允許以key path符號(hào)在一個(gè)集合中執(zhí)行方法,以@開(kāi)頭表示一個(gè)特定的集合方法。鍵值編碼會(huì)在必要的時(shí)候把基本數(shù)據(jù)類(lèi)型進(jìn)行裝箱或者拆箱

它主要分為3類(lèi):1.簡(jiǎn)單集合操作符 2.對(duì)象操作符 3.數(shù)組和集合操作符

簡(jiǎn)單集合操作符

返回string,number等

@max/@min : 獲得數(shù)組中最大(或者最小)的一個(gè)元素,元素內(nèi)部要支持能夠相互比較。這個(gè)好像只能是數(shù)值類(lèi)型,系統(tǒng)并沒(méi)有類(lèi)似compare的方法,只有isEqual,但是并不是排序用的。

@avg : 將集合中對(duì)象轉(zhuǎn)換成double類(lèi)型,返回?cái)?shù)組中指定的平均值的number對(duì)象

@sum :將集合中每個(gè)對(duì)象都轉(zhuǎn)換成double類(lèi)型,然后計(jì)算總和,最后返回一個(gè)值為這個(gè)總和的NSNumber對(duì)象

@count:返回集合中對(duì)象總數(shù)的NSNumber對(duì)象

例子:

[products valueForKeyPath:@"@count"];
[products valueForKeyPath:@"@sum.price"];
[products valueForKeyPath:@"@avg.price"];
[products valueForKeyPath:@"@max.price"];
[products valueForKeyPath:@"@min.launchedOn"];

對(duì)象操作符

@unionOfObjects/@distincUnionOfObjects 返回一個(gè)由操作符右邊的key path指定的對(duì)象屬性組成的數(shù)組,distincUnionOfObjects會(huì)對(duì)數(shù)組去重。

例子:

[inventory valueForKeyPath:@"@unionOfObjects.name"];
[inventory valueForKeyPath:@"@distinctUnionOfObjects.name"];

數(shù)組和集合操作符

@distinctUnionOfArrays/@unionOfArrays 返回一個(gè)數(shù)組,其中包含這個(gè)這個(gè)數(shù)組中每個(gè)子數(shù)組對(duì)于這個(gè)操作符號(hào)右邊指定的key path進(jìn)行操作之后的值。

經(jīng)常會(huì)使用 array unionOfArrays 來(lái)打平多維數(shù)組。

@distinctUnionOfSets 和@distinctUnionOfArrays類(lèi)似,因?yàn)镹SSet中是沒(méi)有重復(fù)的值,所以只有distinct操作

利用這些操作,有時(shí)候可以避免無(wú)聊和重復(fù)的循環(huán),代碼也簡(jiǎn)潔了很多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容