版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.09.12 |
前言
KVC
相信大家再熟悉不过了,键值编码,可以解决很多问题,包括视图上的给UITextField
占位文字颜色大小进行设置等等,还有很多地方可以用KVC,接下来几篇我们就深度解析一下KVC。总结一下,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。还是老规矩,由面到点,由浅到深,希望对大家有所帮助。感兴趣的可以看我写的另外几篇文章。
1. KVC解析(一) —— 基本了解
2. KVC解析(二) —— 不可不知的赋值深层次原理
3. KVC解析(三) —— 不可不知的取值深层次原理
4. KVC解析(四) —— keyPath的深度解析
5. KVC解析(五) —— KVC几种典型的异常处理
6. KVC解析(六) —— KVC容器类及深层次原理
KVC正确性的验证
当开发者需要验证能不能用KVC设定某个值时,就需要在进行KVC赋值前验证值value的有效性,API文档里面提供下面的方法进行判断值的有效性。
- (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
该方法的工作原理:先找一下你的类中是否实现了方法-(BOOL)validate<Key>:error:
,如果实现了就会根据实现方法里面的自定义逻辑返回NO或者YES,如果没有实现这个方法,则系统默认返回就是YES。
下面我们看一下示例代码
#import "JJKVCVerifiedVC.h"
@interface JJKVCVerifiedVC ()
@property (nonatomic, copy) NSString *personName;
@end
@implementation JJKVCVerifiedVC
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
NSError *error;
NSString *key = @"personName";
NSString *value = @"小明";
BOOL result = [self validateValue:&value forKey:key error:&error];
if (error) {
NSLog(@"error = %@", error);
return;
}
if (result) {
NSLog(@"验证正确是小明");
}
else {
NSLog(@"不是小明");
}
}
#pragma mark - Object Private Function
- (BOOL)validatePersonName:(id *)value error:(out NSError * _Nullable __autoreleasing *)outError
{
NSString *name = *value;
if ([name isEqualToString:@"小明"]) {
return YES;
}
return NO;
}
@end
下面看输出结果
2017-09-12 22:09:42.878 JJOC[9834:292358] 验证正确是小明
这里首先调用方法[self validateValue:&value forKey:key error:&error];
,这里,由于我实现了方法- (BOOL)validatePersonName:(id *)value error:(out NSError * _Nullable __autoreleasing *)outError
,所以就在这里进行值value有效性的判断,这里[name isEqualToString:@"小明"]
我就给返回YES,否则就返回NO。
上面这个小的示例还是很简单的,就是验证value赋值前的有效性判断。
后记
未完,待续~~~