KVC
(KVC)鍵值編碼相信大家都不陌生,常用來訪問對(duì)象屬性,也可以訪問集合屬性。還有一些可以給通過此方法訪問一些系統(tǒng)沒有開放的API,通過KVC的方式進(jìn)行使用。(今天的重點(diǎn)不在這里,有需要自己看)
今天重點(diǎn)講valueForKeyPath:
了解valueForKeyPath:方法
??它返回指定的鍵路徑對(duì)應(yīng)的值。如果keyPath中包含不符合規(guī)定的字符(比如沒有這個(gè)屬性字符)就會(huì)接收到一條valueForUndefinedKey:消息。
valueForKeyPath:針對(duì)集合的使用(Array Set)
??實(shí)際上在你日常的需求之中,需要大量的for循環(huán),for,while其實(shí)并不是一種非常簡單優(yōu)雅的實(shí)現(xiàn)方式。在swift中你可以有map,filter,reduse,sequence,foreach等特別簡單的函數(shù)來實(shí)現(xiàn)。而對(duì)于OC的for循環(huán)要簡單不少。不過,其實(shí)在OC中KVC給了我們一種簡潔方式來做這件事情:
NSArray *testArray = @[@1,@2,@3,@4];
NSNumber *sum = [testArray valueForKeyPath:@"@sum.self"];
//對(duì)于對(duì)象一樣可以使用
Person *person1 = [Person new];
person1.name = @"jhon";
person1.age = @26;
Person *person2 = [Person new];
person2.name = @"lee";
person2.age = @20;
Person *person3 = [Person new];
person3.name = @"eleme";
person3.age = @28;
NSArray *personArray = @[person1,person2,person3];
NSNumber *avgAge = [personArray valueForKeyPath:@"@avg.age"];
集合運(yùn)算符
??允許在valueForKeyPath:發(fā)送消息時(shí),可以將集合運(yùn)算符嵌入到消息之中,執(zhí)行這個(gè)方法。在valueForKeypath:的key path中看到@,他就代表著一個(gè)特定的集合方法
簡單集合操作符
@avg 把集合中的每一個(gè)對(duì)象都轉(zhuǎn)化為double類型,返回平均值,返回值類型:NSNumber
@count 返回集合中對(duì)象的總個(gè)數(shù),返回值類型:NSNumber
@max 返回集合中對(duì)象的最大值,返回值類型為本身比較的類型。這里要注意了,比較最大值的時(shí)候用的是compare:方法,所以必須保證集合中每個(gè)對(duì)象都時(shí)可以使用這個(gè)方法的
@min 返回集合中對(duì)象的最大值,返回值類型為本身比較的類型。注意比較方式同上
下面這個(gè)用法都與上面的例子相同
對(duì)象操作符
@distinctUnionOfObjects 返回一個(gè)keyPath指定的對(duì)象屬性的數(shù)組,并且會(huì)對(duì)返回的數(shù)組中的元素進(jìn)行去重
@unionOfObjects 返回一個(gè)keyPath指定的對(duì)象屬性的數(shù)組,注意不去重
舉例說明:
Person *person1 = [Person new];
person1.name = @"jhon";
person1.age = @26;
Person *person2 = [Person new];
person2.name = @"lee";
person2.age = @20;
Person *person3 = [Person new];
person3.name = @"eleme";
person3.age = @28;
Person *person4 = [Person new];
person4.name = @"lee";
person4.age = @26;
NSArray *personArray = @[person1,person2,person3,person4];
NSArray *nameDistinctArray = [personArray valueForKeyPath:@"@distinctUnionOfObjects.name"];
//輸出結(jié)果如下
Printing description of nameArray:
<__NSArrayI 0x6180000565c0>(
jhon,
eleme,
lee
)
NSArray *nameArray = [personArray valueForKeyPath:@"@unionOfObjects.name"];
//輸出結(jié)果如下
Printing description of nameArray:
<__NSArrayM 0x608000045dc0>(
jhon,
lee,
eleme,
lee
)
嵌套集合操作符
??指的是集合本身的每一個(gè)條目都是一個(gè)集合,簡單點(diǎn)就是,集合的嵌套
@distinctUnionOfArrays / @unionOfArrays:返回一個(gè)數(shù)組,其中包含有數(shù)組內(nèi)部的每個(gè)數(shù)組執(zhí)行操作符之后的結(jié)果,含有distinct的會(huì)進(jìn)行去重
@distinctUnionOfSets:返回一個(gè)集合,其中包含有集合內(nèi)部的每個(gè)集合執(zhí)行操作符之后的結(jié)果
Person *person1 = [Person new];
person1.name = @"jhon";
person1.age = @26;
Person *person2 = [Person new];
person2.name = @"lee";
person2.age = @20;
Person *person3 = [Person new];
person3.name = @"eleme";
person3.age = @28;
Person *person4 = [Person new];
person4.name = @"lee";
person4.age = @26;
Person *person5 = [Person new];
person5.name = @"jine";
person5.age = @24;
NSArray *personArray1 = @[person1,person2,person3,person4];
NSArray *personArray2 = @[person3,person4,person5];
NSArray *personArrays = @[personArray1,personArray2];
NSArray *nameDistinctArray = [personArrays valueForKeyPath:@"@distinctUnionOfArrays.name"];
//輸出結(jié)果
Printing description of nameDistinctArray:
<__NSArrayI 0x61000005d3a0>(
lee,
eleme,
jine,
jhon
)
NSArray *nameArray = [personArrays valueForKeyPath:@"@unionOfArrays.name"];
//輸出結(jié)果
Printing description of nameArray:
<__NSArrayM 0x61000005ce90>(
jhon,
lee,
eleme,
lee,
eleme,
lee,
jine
)
??以上就是valueForKeyPath:的全部用法,是不是發(fā)現(xiàn)這玩意不得了。如果讓你在一個(gè)讓你在一個(gè)列表里面找最低價(jià),你就可以不必再去用那些繁瑣的for循環(huán)了。用這種方法一句話就搞定了呢。最后貼上官方文檔的地址,大家可以參考。
??歡迎批評(píng)指正。如需轉(zhuǎn)載請(qǐng)注明出處,請(qǐng)尊重作者的勞動(dòng)成果。