3

私は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 値を受け入れることができますか?

4

1 に答える 1

2

object-c には実行時の自動型チェックはありませんsetValue:frorKey:。value 引数は任意の型になる可能性があるため、使用するとコンパイル時のチェックが回避されます。

実行時の型チェックが必要な場合は、実行時に型をチェックする独自の-setDateTime:(例として) 実装する必要があります。

于 2013-03-27T09:25:40.373 に答える