KVC中級知識

常用方法

上一篇文章講了KVC最基本的知識,只涉及了下面2個方法:

- (nullable id)valueForKey:(NSString*)key;               //取屬性值
- (void)setValue:(nullableid)value forKey:(NSString*)key;//設置屬性值

下面有2個與其類似的方法:

- (nullable id)valueForKeyPath:(NSString*)keyPath;               //取屬性值
- (void)setValue:(nullableid)value forKeyPath:(NSString*)keyPath;//設置屬性值

這兩個方法會根據keyPath中用“.”分隔的key按順序定位到屬性,如下:

@interface Cat: NSObject
@property (nonatomic, copy  ) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end

@interface Person: NSObject
@property (nonatomic, strong) Cat *pet;
@end

Person *person = [[Person alloc] init];
//設置person.pet的name值
[person setValue:@"Tom" forKeyPath:@"pet.name"]; 
//取person.pet的age值
NSNumber *age = [person valueForKeyPath:@"pet.age"];

上面的方法都只能操作單一屬性,下面2個方法能同時作用于多個屬性:

- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;

顧名思義,這2個方法就是根據給的key集合以字典形式返回對應的值和根據跟定的字典設置屬性值。

集合運算

在使用valueForKeyPath且屬性為集合類時,可以在keyPath中嵌入集合運算。集合運算是由符號“@”和跟在后面的一些特定關鍵字組成,通常都是操作在keyPath中跟在其后面的屬性。運算可分為三類,以下面的數據為例:

@interface Person: NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSDate *birthday;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSArray<Person *> *contacts;
@end

假設Jerry的contacts中有3個聯系人,如下表格

name birthday age
John 1985-04-06 33
Tom 1992-01-25 26
John 2001-03-07 17
  • 聚合運算
    @avg:取集合中所有元素,返回它們的算數平均值
    @sum:取集合中所有元素,返回它們相加的值
    @max:取集合中所有元素,返回它們的最大值
    @min:取集合中所有元素,返回它們的最下值
    @count:返回集合中元素的數量,keyPath中其后不需要跟屬性
NSNumber *ageAvg = [Jerry valueForKeyPath:@"contacts.@avg.age"]; //25.33
NSNumber *ageSum = [Jerry valueForKeyPath:@"contacts.@sum.age"]; //76.00
NSNumber *ageMax = [Jerry valueForKeyPath:@"contacts.@max.age"]; //33
NSNumber *birthdayMin = [Jerry valueForKeyPath:@"contacts.@min.birthday"]; //1985-04-06 
NSNumber *count = [Jerry valueForKeyPath:@"contacts.@count"]; //3

@max和@min會調用集合中元素的compare:方法,對于自定義類,你可以自己實現compare:方法。

  • 數組運算
    @distinctUnionOfObjects:取集合中所有元素,返回去重后的數組
    @unionOfObjects:取集合中所有元素,返回未去重的數組
NSArray *distinctContacts = [Jerry valueForKeyPath:@"contacts.@distinctUnionOfObjects.name"];
NSArray *contacts = [Jerry valueForKeyPath:@"contacts.@unionOfObjects.name"];

distinctContacts的結果是{John, Tom},去掉了一個重復的John。
contacts的結果是{John, Tom, John},未去重。

  • 嵌套運算
    該運算針對的是集合中的元素也是集合的情況
    @distinctUnionOfArrays:取集合中所有集合的所有元素,返回去重后的數組
    @unionOfArrays:取集合中所有集合的所有元素,返回未重的數組
    @distinctUnionOfSets:取集合中所有集合的所有元素,返回去重后的集合,和distinctUnionOfArrays不同的是返回的是NSSet而非NSArray。
NSArray *array = @[Jerry, Jerry];
NSArray *distinctContacts = [array valueForKeyPath:@"contacts.@distinctUnionOfArrays.name"];
NSArray *contacts = [Jerry valueForKeyPath:@"contacts.@unionOfArrays.name"];

distinctContacts的結果是{John, Tom},去掉了3個重復的John和1個重復Tom。
contacts的結果是{John, Tom, John,John, Tom, John},未去重。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、基礎知識:1、JVM、JRE和JDK的區別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,410評論 0 4
  • KVC(Key-valuecoding)鍵值編碼,單看這個名字可能不太好理解。其實翻譯一下就很簡單了,就是指iOS...
    榕樹頭閱讀 723評論 0 2
  • HTML 5 HTML5概述 因特網上的信息是以網頁的形式展示給用戶的,因此網頁是網絡信息傳遞的載體。網頁文件是用...
    阿啊阿吖丁閱讀 4,068評論 0 0
  • 元宵而后益團欒, 碧海長天掛玉盤。 遠近云山空翠色, 高低樹影靜欄干。 依依柳岸鴛鴦暖, 皎皎春閨窗月闌。 千里相...
    黔肇張生閱讀 1,453評論 1 10
  • 內在有什么投射,就會看到什么樣的世界。 我們預先的程序,給大腦很多假設和經驗,于是就有了復雜的世界。 現在要做的是...
    MaryCeeport閱讀 347評論 0 1