KVC---使用集合運(yùn)算

來源

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueCoding/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE

當(dāng)你要發(fā)送valueForKeyPath:消息給KVC對象時,你可以把集合運(yùn)算包含在key path里.集合運(yùn)算符是前面帶有(@)的關(guān)鍵字.它可以在數(shù)據(jù)返回前執(zhí)行特定的操作.NSObject提供的valueForKeyPath:默認(rèn)實(shí)現(xiàn)實(shí)現(xiàn)了這種行為.
當(dāng)key path包含集合運(yùn)算符時,在運(yùn)算符前面的是left key path,它表示接收運(yùn)算符的集合.如果你直接把消息發(fā)送給集合對象(比如:NSArray對象),left key path可能會被忽略.
運(yùn)算符后面的,就是right key path,它表示運(yùn)算符是在哪個集合屬性上發(fā)生作用.所有的集合運(yùn)算符(除了@count外),都需要一個right key path.

key path 運(yùn)算格式
key path 運(yùn)算格式

集合運(yùn)算的三種基本運(yùn)算類型:

  • 匯總運(yùn)算:以某種方式合并集合對象,并返回一個單一的對象,這個對象的類型是和right key path里的屬性一樣的.@count運(yùn)算符是特例,你沒有right key path并總是返回NSNumber實(shí)例.
  • 數(shù)組運(yùn)算:總是返回集合里的子集
  • 嵌套運(yùn)算:作用在包含了其它集合的集合,并返回一個NSArrayNSSet實(shí)例.以某種方式合并了嵌套集合.

例子

@interface BankAccount : NSObject
 
@property (nonatomic) NSNumber* currentBalance;              // An attribute
@property (nonatomic) Person* owner;                         // A to-one relation
@property (nonatomic) NSArray< Transaction* >* transactions; // A to-many relation
 
@end
@interface Transaction : NSObject
 
@property (nonatomic) NSString* payee;   // To whom
@property (nonatomic) NSNumber* amount;  // How much
@property (nonatomic) NSDate* date;      // When
 
@end

為了討論,假設(shè)BankAccount實(shí)例,有以下數(shù)據(jù)在transactions數(shù)組里:

payee (values) amount (values formatted as currency) date (values formatted as month day, year)
Green Power $120.00 Dec 1, 2015
Green Power $150.00 Jan 1, 2016
Green Power $170.00 Feb 1, 2016
Car Loan $250.00 Jan 15, 2016
Car Loan $250.00 Feb 15, 2016
Car Loan $250.00 Mar 15, 2016
General Cable $120.00 Dec 1, 2015
General Cable $155.00 Jan 1, 2016
General Cable $120.00 Feb 1, 2016
Mortgage $1,250.00 Jan 15, 2016
Mortgage $1,250.00 Feb 15, 2016
Mortgage $1,250.00 Mar 15, 2016
Animal Hospital $600.00 Jul 15, 2016

你可以簡單的通過把 self 作為操作符后面的 key path 來獲取一個由 NSNumber 組成的數(shù)組或者集合的總值,例如對于數(shù)組 @[@(1), @(2), @(3)] 可使用 valueForKeyPath:@"@max.self" 來獲取最大值。

@avg:

valueForKeyPath:讀取集合里每個元素的right key path屬性,把它轉(zhuǎn)成double(nil值用0表示),并計算它們的算術(shù)平均值.最后把結(jié)果存在NSNumber實(shí)例里并返回.

NSNumber *transactionAverage = [self.transactions valueForKeyPath:@"@avg.amount"];
///transactionAverage 的結(jié)果是$456.54

@count

valueForKeyPath:返回集合里有多少個對象,并存在NSNumber實(shí)例里.如果出現(xiàn)right key path將被忽略.

NSNumber *numberOfTransactions = [self.transactions valueForKeyPath:@"@count"];
//numberOfTransactions的值為13

@max

valueForKeyPath:將搜索集合里全部的right key path的實(shí)體,并返回最大的那個.這個搜索是用compare:方法來對比的.所以right key path所指向的實(shí)體必須是可以使用這個方法的.搜索會忽略nil.

NSDate *latestDate = [self.transactions valueForKeyPath:@"@max.date"];
//latestDate的值是 Jul 15, 2016

@min

與@max相反

NSDate *earliestDate = [self.transactions valueForKeyPath:@"@min.date"];
// earliestDate的值是 Dec 1, 2015

@sum

valueForKeyPath:讀取集合里每個元素的right key path屬性,把它轉(zhuǎn)成double(nil值用0表示),并計算它們的合.最后把結(jié)果存在NSNumber實(shí)例里并返回.

NSNumber *amountSum = [self.transactions valueForKeyPath:@"@sum.amount"];
// amountSum的值是$5935.00

Array Operators

valueForKeyPath:返回一個right key path所指向?qū)傩缘臄?shù)組,這個屬性是集合元素相關(guān)聯(lián)的.

如果所有返回的屬性都是nil,valueForKeyPath:方法會拋出異常

@distinctUnionOfObjects

會返回right key path所指向?qū)ο蟮臄?shù)組,是重復(fù)的將被忽略

NSArray *distinctPayees = [self.transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];
//distinctPayees的結(jié)果:Car Loan, General Cable, Animal Hospital, Green Power, Mortgage.

@unionOfObjects

和@distinctUnionOfObjects相似的行為,但這個并不移除重復(fù)的對象.

NSArray *payees = [self.transactions valueForKeyPath:@"@unionOfObjects.payee"];
// payees的結(jié)果:Green Power, Green Power, Green Power, Car Loan, Car Loan, Car Loan, General Cable, General Cable, General Cable, Mortgage, Mortgage, Mortgage, Animal Hospital.注意有重復(fù)的.

Nesting Operators

NSArray* moreTransactions = @[<# transaction data #>];
NSArray* arrayOfArrays = @[self.transactions, moreTransactions];

moreTransactions里的數(shù)據(jù)

payee (values) amount (values formatted as currency) date (values formatted as month day, year)
General Cable - Cottage $120.00 Dec 18, 2015
General Cable - Cottage $155.00 Jan 9, 2016
General Cable - Cottage $120.00 Dec 1, 2016
Second Mortgage $1,250.00 Nov 15, 2016
Second Mortgage $1,250.00 Sep 20, 2016
Second Mortgage $1,250.00 Feb 12, 2016
Hobby Shop $600.00 Jun 14, 2016

@distinctUnionOfArrays

NSArray *collectedDistinctPayees = [arrayOfArrays valueForKeyPath:@"@distinctUnionOfArrays.payee"];
// collectedDistinctPayees的結(jié)果:Hobby Shop, Mortgage, Animal Hospital, Second Mortgage, Car Loan, General Cable - Cottage, General Cable, Green Power

@unionOfArrays

和@distinctUnionOfArrays一樣,但包含重復(fù)的數(shù)據(jù)

NSArray *collectedPayees = [arrayOfArrays valueForKeyPath:@"@unionOfArrays.payee"];

collectedPayees的結(jié)果:Green Power, Green Power, Green Power, Car Loan, Car Loan, Car Loan, General Cable, General Cable, General Cable, Mortgage, Mortgage, Mortgage, Animal Hospital, General Cable - Cottage, General Cable - Cottage, General Cable - Cottage, Second Mortgage, Second Mortgage, Second Mortgage, Hobby Shop.

@distinctUnionOfSets

這個和@distinctUnionOfArrays是一樣的,只不過它用在NSSet實(shí)例包含NSSet實(shí)例,而不是NSArray包含NSArray.并且,它也是返回一個NSSet實(shí)例.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泛啸,更是在濱河造成了極大的恐慌蜒滩,老刑警劉巖倒谷,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件写隶,死亡現(xiàn)場離奇詭異玫氢,居然都是意外死亡帚屉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門漾峡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涮阔,“玉大人,你說我怎么就攤上這事灰殴【刺兀” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵牺陶,是天一觀的道長伟阔。 經(jīng)常有香客問我,道長掰伸,這世上最難降的妖魔是什么皱炉? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮狮鸭,結(jié)果婚禮上合搅,老公的妹妹穿的比我還像新娘。我一直安慰自己歧蕉,他們只是感情好灾部,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惯退,像睡著了一般赌髓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上催跪,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天锁蠕,我揣著相機(jī)與錄音,去河邊找鬼懊蒸。 笑死荣倾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骑丸。 我是一名探鬼主播舌仍,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鳖孤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抡笼?” 一聲冷哼從身側(cè)響起苏揣,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎推姻,沒想到半個月后平匈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藏古,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年增炭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拧晕。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡隙姿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厂捞,到底是詐尸還是另有隱情输玷,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布靡馁,位于F島的核電站欲鹏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏臭墨。R本人自食惡果不足惜赔嚎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胧弛。 院中可真熱鬧尤误,春花似錦、人聲如沸结缚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掺冠。三九已至沉馆,卻和暖如春码党,著一層夾襖步出監(jiān)牢的瞬間德崭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工揖盘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眉厨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓兽狭,卻偏偏與公主長得像憾股,于是被迫代替她去往敵國和親鹿蜀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容