文章目录
  1. 1. 问题
  • Part II: KVC基础
    1. 1. II_3. 集合操作(Using Collection Operators)
      1. 1.0.0.0.1. 1 . @avg
  • 2. II_4 . 表示一个无对象值(Representing Non-Object Values)
  • 3. II_5 .验证属性(Validating Properties)
  • [TOC]

    问题

    ####1.valueForKeyvalueForKeyPath区别?

    键与键路径之间的区别在于,后者可以包含嵌套关系,用句点分开

    1
    2
    [self.person valueForKey:@"name"];
    [self valueForKeyPath:@"person.name"];

    Part II: KVC基础

    II_3. 集合操作(Using Collection Operators)

    Alt text

    ###三种基本操作

    #####(一) 聚合运算(Aggregation Operators)
    @下面使用的模型

    1 . @avg
    1
    NSNumber *transactionAverage = [self.transactions valueForKeyPath:@"@avg.amount"];

    当使用@avg操作时,集合中的每个属性被转成double类型,然后求得平均值,最后返回NSNumber类型

    ######2. @count

    1
    NSNumber *numberOfTransactions = [self.transactions valueForKeyPath:@"@count"];

    返回对象的数量

    ######3.@max

    1
    NSDate *latestDate = [self.transactions valueForKeyPath:@"@max.date"];

    返回集合中最大的date对象,注意集合中必须包含这个对象,就如🌰中的NSDate

    ######4.@min

    1
    NSDate *earliestDate = [self.transactions valueForKeyPath:@"@min.date"];

    返回最先的date对象

    ######5.@sum

    1
    NSNumber *amountSum = [self.transactions valueForKeyPath:@"@sum.amount"];

    返回amount总和

    #####(二)数组操作(Array Operators)

    数组操作将根据valueForKeyPath的设置,返回一个特定的数组
    当数组对象的操作时,任何一个对象为nil时,都会报错

    ######1. @distinctUnionOfObjects

    1
    NSArray *distinctPayees = [self.transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];

    返回一个字符串类型的集合Car Loan, General Cable, Animal Hospital, Green Power, Mortgage.,重复的对象将会被移除

    ######2. @unionOfObjects

    1
    NSArray *payees = [self.transactions valueForKeyPath:@"@unionOfObjects.payee"];

    重复的对象不会被移除,返回字符串数组:Green Power, Green Power, Green Power, Car Loan, Car Loan, Car Loan, General Cable, General Cable, General Cable, Mortgage, Mortgage, Mortgage, Animal Hospital

    #####(三) 嵌套操作(Nesting Operators)
    @moreTransactions的数据

    嵌套操作针对于嵌套的集合使用,同样操作的集合中的对象不能为nil

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

    ######1. @distinctUnionOfArrays

    1
    NSArray *collectedDistinctPayees = [arrayOfArrays valueForKeyPath:@"@distinctUnionOfArrays.payee"];

    返回两个数组中的payee对象:: Hobby Shop, Mortgage, Animal Hospital, Second Mortgage, Car Loan, General Cable - Cottage, General Cable, Green Power,注意,此操作已过滤相同元素

    ######2. @unionOfArrays

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

    返回: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.,不过滤重复对象

    ######3.@distinctUnionOfSets
    类比@distinctUnionOfArrays

    II_4 . 表示一个无对象值(Representing Non-Object Values)

    II_5 .验证属性(Validating Properties)

    有趣的是验证过程中有三种结果

    1. 验证有效,返回YES
    2. 验证无效,返回NO,附带error
    3. 验证方法认为值对象无效,但创建一个新的有效的值对象作为替换。在这种情况下,方法返回YES,而将错误对象保持不变。在返回之前,该方法将修改值引用以指向新的值对象。当它进行修改时,方法总是创建一个新对象,而不是修改旧的对象,即使值对象是可变的。
    1
    2
    3
    4
    5
    6
    Person* person = [[Person alloc] init];
    NSError* error;
    NSString* name = @"John";
    if (![person validateValue:&name forKey:@"name" error:&error]) {
    NSLog(@"%@",error);
    }
    文章目录
    1. 1. 问题
  • Part II: KVC基础
    1. 1. II_3. 集合操作(Using Collection Operators)
      1. 1.0.0.0.1. 1 . @avg
  • 2. II_4 . 表示一个无对象值(Representing Non-Object Values)
  • 3. II_5 .验证属性(Validating Properties)