KVC(三)

接上: KVC(二)
接下来我们来看看 集合集合操作符(集合作为属性)
参考官网:Accessing Collection PropertiesUsing Collection OperatorsDefining Collection Methods

参考其他:Key-Value CodingKey-Value Coding(键值编码)


1.固定有序集合属性(NSArray)

#import "ViewController8.h"
@interface Person_8 : NSObject
@property (nonatomic,strong)NSString  *name;
@end

@implementation Person_8
@end

@interface Students_8 : NSObject
//@property (nonatomic,strong)NSArray<Person_8*> *personArr;
@end

@implementation Students_8
/**
 返回数组的个数
 */
-(NSInteger)countOfPersonArr{
    NSLog(@"countOfPersonArr");
    return  5;
}

/**
 传入需要取的 indexes下标,返回一个数组
 */
-(NSArray *)personArrAtIndexes:(NSIndexSet *)indexes{
    NSLog(@"personArrAtIndexes---");
    return @[@"a",@"b",@"c",@"d",@"e"];
}

/**
 传入一个 index 返回数组内的 index下标对应的值
 */
-(id)objectInPersonArrAtIndex:(NSUInteger)index{
    NSLog(@"objectInPersonArrAtIndex");
    return @"*_*";
}

-(void)getPersonArr:(Person_8 **)buffer range:(NSRange)inRange{
    NSLog(@"getPersonArr-buffer-inRange");
}
@end
//===================================

@interface ViewController8 ()
@end

@implementation ViewController8
- (void)viewDidLoad {
    [super viewDidLoad];
    Students_8 *stu = [Students_8 new];
    
    //调用了countOfPersonArr、getPersonArr-buffer-inRange
    NSLog(@"%@",[stu valueForKey:@"personArr"]);
    NSLog(@"=========11111========");
    
    //调用了countOfPersonArr
    NSLog(@"%lu",[[stu  valueForKey:@"personArr"] count]);
    NSLog(@"=========22222========");
    
    //调用了objectInPersonArrAtIndex
    NSLog(@"%@",[[stu  valueForKey:@"personArr"] objectAtIndex:0]);
    NSLog(@"=========33333========");
    
    //调用personArrAtIndexes
    NSLog(@"%@",[[stu  valueForKey:@"personArr"] objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)]]);
    NSLog(@"=========44444========");
   
}

/*
 * 索引访问器(index accessor)  针对NSArray这样的有序集合
 * getter索引访问器:(需实现的方法)
    - countOf<Key>
    - objectIn<Key>AtIndex: 或者 -<Key>AtIndexes:
    - get<Key>:range:
 */
@end

2.固定无序集合属性(NSSet)

#import "ViewController9.h"

@interface Person_9 : NSObject
//@property (nonatomic,strong)NSSet  *namesSet;
@end

@implementation Person_9
/**
 返回set的个数
 */
-(NSUInteger)countOfNamesSet{
    NSLog(@"countOfNamesSet");
    return 5;
}

/**
 是否包含对象
 */
-(NSString *)memberOfNamesSet:(NSString *)object{
    NSLog(@"memberOfNamesSet");
    return object;
}

/**
 返回 遍历器
 */
-(NSEnumerator *)enumeratorOfNamesSet{
    NSLog(@"enumeratorOfNamesSet");
    return [[[NSSet alloc]init]  objectEnumerator];
}
@end
//====================

@interface ViewController9 ()
@end

@implementation ViewController9

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person_9  *p = [[Person_9 alloc]init];
    
    NSLog(@"=======111========");
    NSLog(@"%lu",[[p valueForKey:@"namesSet"] count]);//调用countOfNamesSet
    
    NSLog(@"=======222========");
    NSLog(@"%@",[[p valueForKey:@"namesSet"] member:@"AAA"]);//调用memberOfNamesSet
    
    NSLog(@"=======333========");
    NSLog(@"%d",[[p valueForKey:@"namesSet"] containsObject:@"BBB"]);//调用memberOfNamesSet
    
    NSLog(@"=======444========");//调用enumeratorOfNamesSet
    [[p valueForKey:@"namesSet"] objectEnumerator];
    
    NSLog(@"=======555========");
}

/*
 无序访问器: 针对 NSSet样的无序集合
 getter无序访问器其实现如下:
    - countOf<Key>
    - enumeratorOf<Key>
    - memberOf<Key>:
 */
@end

3.可变有序集合属性(NSMutableArray)

#import "ViewController10.h"
@interface Person_10 : NSObject
//@property (nonatomic,strong)NSMutableArray  *namesArrM;
@end

@implementation Person_10
//--------------------------
//插入一个数组对象
-(void)insertNamesArrM:(NSArray *)array atIndexes:(NSIndexSet *)indexes{
    NSLog(@"insertNamesArrM");
}

//插入一个对象
-(void)insertObject:(NSString *)object inNamesArrMAtIndex:(NSUInteger)index{
    NSLog(@"insertObject");
}

//移除一个数组
-(void)removeNamesArrMAtIndexes:(NSIndexSet *)indexes{
    NSLog(@"removeNamesArrMAtIndexes");
}

//移除一个对象
-(void)removeObjectFromNamesArrMAtIndex:(NSUInteger)index{
    NSLog(@"removeObjectFromNamesArrMAtIndex");
}

//根据下标,替换数组
-(void)replaceNamesArrMAtIndexes:(NSIndexSet *)indexes withNamesArrM:(NSArray *)array{
    NSLog(@"replaceNamesArrMAtIndexes");
}

//根据下标替换一个对象
-(void)replaceObjectInNamesArrMAtIndex:(NSUInteger)index withObject:(id)object{
    NSLog(@"replaceObjectInNamesArrMAtIndex");
}
@end
//====================================================

@interface ViewController10 ()
@end

@implementation ViewController10
- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person_10  *p = [[Person_10 alloc]init];
    NSLog(@"======111=====");
    //会调用:insertObject
    [[p mutableArrayValueForKey:@"namesArrM"] insertObject:@"1" atIndex:0];
    
    NSLog(@"======222=====");
    //会调用:insertNamesArrM
    [[p mutableArrayValueForKey:@"namesArrM"] insertObjects:@[@"q",@"w"] atIndexes:[NSIndexSet indexSetWithIndex:0]];
    
    NSLog(@"======333=====");
    //会调用:removeNamesArrMAtIndexes
    [[p mutableArrayValueForKey:@"namesArrM"] removeObjectsAtIndexes:[NSIndexSet indexSetWithIndex:0]];
    
    NSLog(@"======444=====");
    //会调用:removeObjectFromNamesArrMAtIndex
    [[p mutableArrayValueForKey:@"namesArrM"] removeObjectAtIndex:0];
    
    NSLog(@"======555=====");
    //会调用:replaceObjectInNamesArrMAtIndex
    [[p mutableArrayValueForKey:@"namesArrM"] replaceObjectAtIndex:0 withObject:@"1"];
    
    NSLog(@"======666=====");
    //会调用 :replaceNamesArrMAtIndexes
    [[p mutableArrayValueForKey:@"namesArrM"] replaceObjectsAtIndexes:[NSIndexSet indexSetWithIndex:0] withObjects:@[@"1",@"2"]];
}

/*
 mutable有序索引访问器:  需实现
 -insertObject:in<Key>AtIndex:或者-insert<Key>:atIndexes:
 -removeObjectFrom<Key>AtIndex:或者-remove<Key>AtIndexes:
 -replaceObjectIn<Key>AtIndex:withObject:或者-replace<Key>AtIndexes:with<Key>:
 */
@end

4.可变无序集合属性(NSMutablSet)

#import "ViewController11.h"

@interface Person_11 : NSObject
//@property (nonatomic,strong)NSMutableSet  *namesSetM;
@end

@implementation Person_11
//添加多个对象、并集
-(void)addNamesSetM:(NSSet *)objects{
    NSLog(@"addNamesSetM");
}

//添加单个对象
-(void)addNamesSetMObject:(NSString *)object{
    NSLog(@"addNamesSetMObject");
}

//移除多个对象
-(void)removeNamesSetM:(NSSet *)objects{
    NSLog(@"removeNamesSetM");
}
//移除单个对象
-(void)removeNamesSetMObject:(NSString *)object{
    NSLog(@"removeNamesSetMObject");
}

//交集
-(void)intersectNamesSetM:(NSSet *)objects{
    NSLog(@"intersectNamesSetM");
}
@end


@interface ViewController11 ()
@end

@implementation ViewController11
- (void)viewDidLoad {
    [super viewDidLoad];
    Person_11 *p = [[Person_11 alloc]init];
    
    NSLog(@"=====1111======");
    //调用:addNamesSetMObject
    [[p mutableSetValueForKey:@"namesSetM"] addObject:@"111"];
    
    NSLog(@"=====2222======");
    //调用:addNamesSetM
    [[p mutableSetValueForKey:@"namesSetM"] unionSet:[NSSet setWithObjects:@"1",@"2",nil]];//并集

    NSLog(@"=====3333======");
    //调用:removeNamesSetMObject
    [[p mutableSetValueForKey:@"namesSetM"] removeObject:@"1"];
    
    NSLog(@"=====4444======");
    //调用:removeNamesSetM
    [[p mutableSetValueForKey:@"namesSetM"] minusSet:[NSSet setWithObjects:@"1", nil]];//删除前者中与后者相同的元素
    
    NSLog(@"=====5555======");
    //调用:intersectNamesSetM
    [[p mutableSetValueForKey:@"namesSetM"] intersectSet:[NSSet setWithObjects:@"1",@"2",nil]]; //交集
    
}

/*
 mutable无序访问器实现如下方法:
 - add<Key>Object:或者-add<Key>:
 - remove<Key>Object:或者-remove<Key>:
 - intersect<Key>:
 */
@end

5.可变有序集合(NSMutableOrderedSet)

#import "ViewController16.h"

@interface ViewController16 ()
//@property (nonatomic,strong)NSMutableOrderedSet  *orderedSetM;
@end

@implementation ViewController16
////插入单个对象
//-(void)insertObject:(NSString *)object inOrderedSetMAtIndex:(NSUInteger)index{
//     NSLog(@"insertObject");
//}
//插入多个对象
-(void)insertOrderedSetM:(NSArray *)array atIndexes:(NSIndexSet *)indexes{
    NSLog(@"insertOrderedSetM");
}

//替换单个对象
-(void)replaceObjectInOrderedSetMAtIndex:(NSUInteger)index withObject:(id)object{
    NSLog(@"replaceObjectInOrderedSetMAtIndex");
}

//替换多个对象(set)
-(void)replaceOrderedSetMAtIndexes:(NSIndexSet *)indexes withOrderedSetM:(NSArray *)array{
    NSLog(@"replaceOrderedSetMAtIndexes");
}

//移除单个对象
-(void)removeObjectFromOrderedSetMAtIndex:(NSUInteger)index{
    NSLog(@"removeObjectFromOrderedSetMAtIndex");
}
//移除多个对象
-(void)removeOrderedSetMAtIndexes:(NSIndexSet *)indexes{
    NSLog(@"removeOrderedSetMAtIndexes");
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"====1111=====");
    [[self mutableOrderedSetValueForKey:@"orderedSetM"] insertObject:@"1" atIndex:0];
    
    NSLog(@"====2222=====");
    [[self mutableOrderedSetValueForKey:@"orderedSetM"] insertObjects:@[@"1",@"2"] atIndexes:[NSIndexSet  indexSetWithIndex:0]];
    
    NSLog(@"====3333=====");
    [[self mutableOrderedSetValueForKey:@"orderedSetM"] replaceObjectAtIndex:0 withObject:@"1"];
    
    NSLog(@"====4444=====");
    [[self mutableOrderedSetValueForKey:@"orderedSetM"] replaceObjectsAtIndexes:[NSIndexSet indexSetWithIndex:0] withObjects:@[@"1",@"2"]];
    
    NSLog(@"====5555=====");
    [[self mutableOrderedSetValueForKey:@"orderedSetM"] removeObjectAtIndex:0];
    
    NSLog(@"====6666=====");
    [[self mutableOrderedSetValueForKey:@"orderedSetM"] removeObjectsAtIndexes:[NSIndexSet  indexSetWithIndex:0]];
}
/*
 mutable有序的集合 需实现
 insertObject:in<Key>AtIndex:  或 insert<Key>:atIndexes:
 removeObjectFrom<Key>AtIndex: 或 remove<Key>AtIndexes:
 replaceObjectIn<Key>AtIndex:withObject: 或 replace<Key>AtIndexes:with<Key>:
 注意:可以实现多个对象的方法,当有对于多个对象的操作(需要实现多个处理的相应的方法)
 */
@end

6.集合操作符

#import "ViewController15.h"
//#import  <objc/runtime.h>

@interface Transaction : NSObject
@property (nonatomic) NSString* payee;   // To whom
@property (nonatomic) NSNumber* amount;  // How much
@property (nonatomic) NSDate* date;      // When
@end

@implementation Transaction
@end
//==========================

@interface ViewController15 ()
@property (nonatomic,strong)NSArray  *transactions;
@end

@implementation ViewController15
- (void)viewDidLoad {
    [super viewDidLoad];
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    Transaction *t1 = [[Transaction alloc]init];
    t1.payee = @"Jack";
    t1.amount = @(100);
    t1.date = [formatter dateFromString:@"2018-12-01 01:23:10"];
    
    Transaction *t2 = [[Transaction alloc]init];
    t2.payee = @"Lucy";
    t2.amount = @(200);
    t2.date = [formatter dateFromString:@"2018-09-10 01:20:00"];
    
    Transaction *t3 = [[Transaction alloc]init];
    t3.payee = @"Lucy";
    t3.amount = @(300);
    t3.date = [formatter dateFromString:@"2018-10-10 09:20:00"];
    
    self.transactions = @[t1,t2,t3];
    
    //集合操作符(例子)
    //格式:keyPathToCollection.@collectionOperator.keypathTpProperty
    //集合的keypath.操作符.要操作的属性
    
    
    //1.Aggregation Operators(聚合运算符)
    NSNumber *transactionAverage = [self valueForKeyPath:@"transactions.@avg.amount"];
    NSLog(@"平均消费:%@",transactionAverage);//平均消费:200

    NSNumber *numberOfTransactions = [self.transactions valueForKeyPath:@"@count"];
    NSLog(@"消费者个数:%@",numberOfTransactions);//消费者个数:3
    
    
    NSDate *latestDate = [self.transactions valueForKeyPath:@"@max.date"];
    NSLog(@"最近消费的时间:%@",latestDate);//最近消费的时间:2018-11-30 17:23:10 +0000
    
    
    NSDate *earliestDate = [self.transactions valueForKeyPath:@"@min.date"];
    NSLog(@"最早消费的时间:%@",earliestDate);//最早消费的时间:2018-09-09 17:20:00 +0000
    
    NSNumber *amountSum = [self.transactions valueForKeyPath:@"@sum.amount"];
    NSLog(@"消费的总和:%@",amountSum);//消费的总和:600
    
    //2.Array Operators(集合操作符)
    //@distinctUnionOfObjects(返回操作对象内部的不同对象,返回值为数组)
    NSArray *distinctPayees = [self.transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];
    NSLog(@"消费者是:%@",distinctPayees);
    
    
    //@unionOfObjects(返回操作对象内部的所有对象)
    NSArray *payees = [self.transactions valueForKeyPath:@"@unionOfObjects.payee"];
    NSLog(@"所有消费记录上的消费者(或许有重复的):%@",payees);
    
    
    //3.Nesting Operators(嵌套操作符)
    Transaction *t4 = [[Transaction alloc]init];
    t4.payee = @"Jack";
    t4.amount = @(1000);
    t4.date = [formatter dateFromString:@"2019-12-01 01:23:10"];
    NSArray* moreTransactions = @[t4];
    NSArray* arrayOfArrays = @[self.transactions, moreTransactions,self.transactions];
    
    //@distinctUnionOfArrays(返回操作对象(且操作对象内对象必须是数组/集合)中数组/集合的不同对象,返回值为数组->去重)
    NSArray *collectedDistinctPayees = [arrayOfArrays valueForKeyPath:@"@distinctUnionOfArrays.payee"];
    NSLog(@"消费者(去重):%@",collectedDistinctPayees);
    
    //@unionOfArrays(返回操作对象(且操作对象内对象必须是数组/集合)中数组/集合的所有对象,返回值为数组)
    NSArray *collectedPayees = [arrayOfArrays valueForKeyPath:@"@unionOfArrays.payee"];
    NSLog(@"所有消费记录上的消费者数组(或许有重复的)%@",collectedPayees);
    
    
    NSSet *setA = [NSSet setWithObjects:t1, t2, nil];
    NSSet *setB = [NSSet setWithObjects:t3, t4, nil];
    NSSet *set = [NSSet setWithObjects:setA, setB, nil];
    //@distinctUnionOfSets(返回操作对象(且操作对象内对象必须是数组/集合)中数组/集合的所有对象,返回值为集合)
    NSSet *payeesSet = [set valueForKeyPath:@"@distinctUnionOfSets.payee"];
    NSLog(@"所有消费记录上的消费者集合(没有重复的)%@",payeesSet);
}
@end

友情链接:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 源码加翻译 #import <Foundation/NSArray.h> #import <Foundation/...
    CAICAI0阅读 1,153评论 0 50
  • 关于键值编码 键值编码(KVC)是一种由NSKeyValueCoding非正式协议提供的机制,对象采用该机制来提供...
    渐z阅读 924评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • 4月6日 晴 清明假期 今天天气特别好,是个出外游玩的好天气,早上吃过饭,买了许多好吃的,带你...
    严晓芹阅读 153评论 0 0
  • 家豪今天我们要去潍坊了,你小姨要结婚。因为太远所以我们要今天就去。今天还是元旦的联欢会。中午本来打算不让你...
    家豪妈妈阅读 126评论 0 2