zoukankan      html  css  js  c++  java
  • objective-c KVC

    KVC(KeyValueCoding)的基本概念

      KVC是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可以访问对象属性

      KVC方法在obj-c非正式协议NSKeyValue’Coding中被声明,默认的实现方法由NSObject提供

      KVC支持带有对象值的属性,同时也支持纯数值类型和结构,非对象参数和返回类型会背识别并自动封装、解封

    设置和访问(键值访问)

      KVC中的基本调用包括- (id)valueForKey:(NSString *)key;和- (void)setValue:(id)value forKey:(NSString *)key;这两个方法,他们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。

      如果不存在set和get方法,它将在内部查找名为key或_key的示例变量(name或_name)。通过KVC可以获取不存在get方法的对象值,无需通过对象指针直接访问。

      在设置对象的值时,若对象的实例变量为基本数据类型(char、int、float、BOOL),需要对数据进行封装。

    路径访问

      KVC还支持路径访问,像文件系统一样,用 “.” 号分割。

    一对多的访问

      如果向NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你

    KVC的简单运算

      可以利用KVC做一些简单运算,sum、min、max、avg、count

      运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber

     

     

     

    示例代码:

    Book.h

    #import <Foundation/Foundation.h>
    #import "Author.h"
    @interface Book : NSObject
    {
        NSString *name;
        Author *author;
        NSArray *other;
        
    }
    
    @end

    Book.m

    #import "Book.h"
    
    @implementation Book
    
    @end

    Author.h

    #import <Foundation/Foundation.h>
    
    @interface Author : NSObject
    
    @property(nonatomic,copy)NSString *name;
    
    @end

    Author.m

    #import "Author.h"
    
    @implementation Author
    
    @end

    main.m

    #import <Foundation/Foundation.h>
    #import "Book.h"
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            // insert code here...
            NSLog(@"Hello, World!");
            
            //键值访问
            Book *book = [[Book alloc]init];
            [book setValue:@"三体2:黑暗森林" forKey:@"name"];//设置
            NSLog(@"%@",[book valueForKey:@"name"]);//访问
            
            //路径访问
            Author *author = [[Author alloc]init];
            author.name = @"刘慈欣";
            [book setValue:author forKey:@"author"];
            NSLog(@"%@",[book valueForKeyPath:@"author.name"]);//此处的点是路径分割,不是点语法
            
            //一对多
            NSMutableArray *arr = [[NSMutableArray alloc]init];
            for (int i = 0; i<3; i++) {
                Book *book = [[Book alloc]init];
                NSString *name = [NSString stringWithFormat:@"other_%d",i];
                [book setValue:name forKey:@"name"];
                [arr addObject:book];
            }
            [book setValue:arr forKey:@"other"];
            NSLog(@"%@",[book valueForKeyPath:@"other.name"]);
            
            NSArray *arr1 = [arr valueForKeyPath:@"name"];
            NSLog(@"%@",arr1);
            
            //KVC的简单运算
            NSLog(@"%@",[book valueForKeyPath:@"other.name.@count"]);//查看个数
            /*
             [XXX valueForKeyPath:@"路径key.@sum.要进行运算的key"]//在运算中,先写入第一个路径,在最后要运算的属性前加@sum、@min等等,
                                        运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber
    */ } return 0; }

     运行结果:

    2014-01-02 13:14:45.219 KVC[1387:303] Hello, World!
    2014-01-02 13:14:45.221 KVC[1387:303] 三体2:黑暗森林
    2014-01-02 13:14:45.221 KVC[1387:303] 刘慈欣
    2014-01-02 13:14:45.221 KVC[1387:303] (
        "other_0",
        "other_1",
        "other_2"
    )
    2014-01-02 13:14:45.222 KVC[1387:303] (
        "other_0",
        "other_1",
        "other_2"
    )
    2014-01-02 13:14:45.222 KVC[1387:303] 3
  • 相关阅读:
    设计模式之里氏替换原则
    设计模式之依赖倒转原则
    设计模式之接口分离原则
    spring 集成 kafka producer(KafkaTemplate)
    jmeter 分布式
    ant+Jenkins+jmeter
    pycharm+git+github项目上传
    Python_pip下载不下来源解决方案
    linux_python3环境搭建
    Jenkins+Git+Github+Python自动化化接口项目例子
  • 原文地址:https://www.cnblogs.com/mo-shou/p/3501710.html
Copyright © 2011-2022 走看看