Objective-C中KVC的集合操做符

鍵值編碼(KVC)集合操做(Collection Operators)提供了一種很是簡潔的運算方法,能夠有效避免使用循環,如for,while或快速枚舉。 數組

這些方法包括三種類型,簡單集合運算符、對象操做符、數組和集合操做符。Apple不容許自定義集合操做符,但實際上利用swizzle黑魔法,能夠作到自定義操做符。有興趣能夠參考http://kickingbear.com/blog/archives/9 編碼

  1. 簡單集合運算符,返回strings,number或dates

    @count : 返回一個值爲集合中對象總數的NSNumber對象。
    @sum : 首先把集合中的每一個對象都轉換爲double類型,而後計算其總,最後返回一個值爲這個總和的NSNumber對象。
    @avg: Takes the double value of each object in the collection, and returns the average value as an NSNumber.
    @max : 使用compare:方法來肯定最大值。因此爲了讓其正常工做,集合中全部的對象都必須支持和另外一個對象的比較。
    @min : 和@max同樣,可是返回的是集合中的最小值。 spa

假設一個Product類,以下所示 .net

@interface Product : NSObject
@property NSString *name;
@property double price;
@property NSDate *launchedOn;
@end



數據以下圖所示,組成一個products數組,這裏省略了初始化一個Product對象,並添加至products數組的代碼,請自行腦補。 code

那麼使用kvc鍵值路徑的運算符操做,能夠獲得數組個數、價格總和、均價和最先發布日期 對象

[products valueForKeyPath:@"@count"]; // 4
[products valueForKeyPath:@"@sum.price"]; // 3526.00
[products valueForKeyPath:@"@avg.price"]; // 881.50
[products valueForKeyPath:@"@max.price"]; // 1699.00
[products valueForKeyPath:@"@min.launchedOn"]; // June 11, 2012



能夠這樣理解,以其中一個爲例。@sum.price,price是product的一個屬性。@sum的@符號意味着後面將進行運算,@sum通知KVC機制進行總和計算。


2. 對象操做符,返回一個數組 blog

    @unionOfObjects/@distinctUnionOfObjects: 返回一個由操做符右邊的key path所指定的對象屬性組成的數組。其中@distinctUnionOfObjects 會對數組去重, 並且 @unionOfObjects 不會。 get

有如下數組,每一個數組成員都是一個Product類對象。 string

 NSArray *inventory = @[iPhone5, iPhone5, iPhone5, iPadMini, macBookPro, macBookPro];
那麼,
[inventory valueForKeyPath:@"@unionOfObjects.name"]; // "iPhone 5", "iPhone 5", "iPhone 5", "iPad Mini", "MacBook Pro", "MacBook Pro"
[inventory valueForKeyPath:@"@distinctUnionOfObjects.name"]; // "iPhone 5", "iPad Mini", "MacBook Pro"



能夠看到 @distinctUnionOfObjects剔除了重複成員數據,而@unionOfObjects保留了所有。

3. 數組和集合運算符,返回一個數組或者集合 io

    @distinctUnionOfArrays/@unionOfArrays: 返回了一個數組,其中包含這個集合中每一個數組對於這個操做符右面指定的key path進行操做以後的值。正如你指望的,distinct版本會移除重複的值。

    @distinctUnionOfSets: 和@distinctUnionOfArrays差很少, 可是它指望的是一個包含着NSSet對象的NSSet,而且會返回一個NSSet對象。由於集合不能包含重複的值,因此它只有distinct操做。

與對象操做符相似,你們能夠本身嘗試。

相關文章
相關標籤/搜索