objc(iOS,macOS) 用KVC设置结构体git
我花了一些时间完成了这个扩展KeyPathExtension,而且加入了更多的功能。把谓词功能也和KVC结合在一块儿了,私觉得这样的结合并无额外的学习成本和更多代码开销,反而让代码更加简洁,但愿你们可以给个赞吧。github
实现结构体路径的扩展思路:数据结构
在Fundation中KVC提供的键值路径只能访问对象,不能访问结构体。其实能够更面向对象。学习
执行下面的语句将会报错:this
[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的结构体信息,而后拿到关于这个结构体如何取值和赋值的信息。有了这两条信息就能够了。spa
最方便的数据结构就是字典,Key是objcType,value用block,里面放置如何操做传入的结构体内容。综合来看这样基本上也没什么很大的开销。code
@{ @"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]; } , ... ... }