欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS 用KVC设置结构体

程序员文章站 2024-01-21 10:14:52
iOS 用KVC设置结构体 在Fundation中KVC提供的键值路径只能访问对象,不能访问结构体。这很不面向对象。 执行下面的语句将会报错: 实现这个功能是很简单的:首先NSValue的结构体信息,然后拿到关于这个结构体如何取值和赋值的信息。有了这两条信息就可以了。 最方便的数据结构就是字典,Ke ......

ios 用kvc设置结构体

  在fundation中kvc提供的键值路径只能访问对象,不能访问结构体。这很不面向对象。

  执行下面的语句将会报错:

[self setvalue:@(100) forkeypath:@"view.frame.width.x"];

// reason: '[<nsconcretevalue 0x600003466740> valueforundefinedkey:]: this class is not key value coding-compliant for the key width.'

  实现这个功能是很简单的:首先nsvalue的结构体信息,然后拿到关于这个结构体如何取值和赋值的信息。有了这两条信息就可以了。

  最方便的数据结构就是字典,key是objctype,value用block,里面放置如何操作传入的结构体内容。综合来看这样基本上也没什么很大的开销。

@{
    @"size"   :   ^(nsvalue* value){
    
        return [nsvalue valuewithcgsize:[value cgrectvalue].size];
    } ,
    ... ...
}
@{
    @"size"   :   ^(nsvalue* value , id newvalue){

        cgrect rect = [value cgrectvalue];
        rect.size = [newvalue cgsizevalue];
        return [nsvalue valuewithcgrect:rect];
    } ,
    ... ...
}

  我花了一些时间完成了这个扩展akvcextension,并且加入了更多的功能。把谓词功能也和kvc结合在一起了,私以为这样的结合并没有额外的学习成本和更多代码开销,反而让代码更加简洁,希望大家能够给个赞吧。