Objective-C KVC改变了财产的类型

时间:2013-03-27 09:10:58

标签: ios objective-c kvc

我是Objective-c的新手。我正在编写一个简单的方法将字典转换为对象来练习KVC知识:

+(id) ConvertDictionary:(NSDictionary *)dict 
                         ToClassInstance:(Class)type{

id targetObj = nil;
if(dict){
    NSArray *dictKeys = dict.allKeys;
    targetObj = [[type alloc] init];

    for (NSString*item in dictKeys) { 
            [targetObj setValue:[dict objectForKey:item] forKey:item];
        }
    }
}
return targetObj;
}

一个简单的课程:

 #import <Foundation/Foundation.h>
 @interface foo : NSObject
 @property (nonatomic) int value;
 @property(nonatomic,strong) NSDate *dateTime;
 @end

使用以下代码运行方法:

-(void)testConvert
{
   NSArray *value = [NSArray arrayWithObjects:
                     [NSNumber numberWithInt:2],@"wrongDateString",nil];
   NSArray *key = [NSArray arrayWithObjects:@"value",@"dateTime", nil];

   NSDictionary *dict = [NSDictionary dictionaryWithObjects: value forKeys:key];

   id result= [EPMClassUtility ConvertDictionary:dict 
                               ToClassInstance:[foo class]];
    foo *convert = (foo*) result; 
    NSLog(@"get value: %@",convert.dateTime);
    //console write the line: get value:wrongDateString

}

我的问题是,我通过setValue:forKey:向属性提供了一个错误类型的值(应该是NSDate但实际上是NSString)。但是为什么运行时或XCode中没有异常发生,属性dateTime如何接受NSString值?

1 个答案:

答案 0 :(得分:2)

没有针对objective-c的自动运行时类型检查,并且使用setValue:frorKey:可以避免任何编译时检查,因为value参数可以是任何类型。

如果您想要运行时类型检查,则需要实现自己的-setDateTime:(作为示例),以便在运行时检查类型。