2011-07-11 12 views
0

PLISTまたは辞書に含まれるデータからオブジェクトプロパティを設定できるように、NSObjectの拡張を作成しました。私はsetValuesForKeysWithDictionaryを使用しましたが、これはkeyPathsではないキーに対してのみ機能します。私の拡張は同じことをしますが、PLISTにキーとキーの両方を含めることができます。たとえば、detailTextLabel.text @「詳細テキスト」をキー値のペアとして指定します。setValueForKeyPathの堅牢性を改善する

PLISTのタイプミスのためにアプリがクラッシュする可能性があることを除いて、これはうまくいきます。たとえば、プロパティ名が存在するが予想外のタイプ(文字列の代わりに数字)の場合はクラッシュします。これらのタイプのエラーを避けるために、これをより堅牢にし、防御的にコードを作成する最良の方法は何ですか?

私のオブジェクトには既に- (void) setValue:(id)value forUndefinedKey:(NSString *)key {}が使用されていますが、実際のキーには対応していない項目をPLISTにトラップしています。

#pragma mark - 
#pragma mark Extensions to NSObject 

@implementation NSObject (SCLibrary) 

- (void) setValuesForKeyPathsWithDictionary:(NSDictionary *) keyPathValues { 
    NSArray *keys; 
    int i, count; 
    id key, value; 

    keys = [keyPathValues allKeys]; 
    count = [keys count]; 
    for (i = 0; i < count; i++) 
    { 
     key = [keys objectAtIndex: i]; 
     value = [keyPathValues objectForKey: key]; 

     [self setValue:value forKeyPath:key]; 
    } 
} 

おかげさまで、Dave。

答えて

3

てきたが、しかし私は、その値を設定しようとする前に、セレクタをチェックしたアプローチを見つけることを期待していた、クラッシュからアプリを防ぐないsetValue:forKeyPath:

@try { 
    [self setValue:value forKeyPath:key]; 
} 
@catch (NSException * e) { 
    NSLog(@"%@",e); 
} 

の周りに一般@try/@catchを追加しました。

より良い回答が得られない場合は、この回答を受け入れます。

関連する問題