2012-04-11 8 views
1

私は、文字列値から属性を設定することに大きく依存するコアデータを使用してアプリケーションを作成しています。しかし、コアデータはラッパーメソッドを作成するときにNSNumberを使用してすべての数値フィールドを表現するため、問題が発生しています。したがって、キー/値コーディングsetValue:forKeyを使用してStringを渡すと、タイプエラーが発生します。iOSのキー値型強制

たとえば、私はオブジェクト型 "Building"を持っています。データモデルでは、私はその後、32

を整数に設定し、 "fbFloors" という属性を持って、私のコードでは、私は次の操作を行います

ビル* B = [NSEntityDescription insertNewObjectForEntityForName: "ビル" inManagedObjectContext @: ctx]; [b setValue:@ "2" forKey:@ "fbFloors"];

これは、次の例外が発生します「属性の値の許容できないタイプ:アプリを終了

キャッチされない例外により「NSInvalidArgumentException」、理由のプロパティ= 『fbFloorsを』。所望のタイプ= NSNumber;指定された型= __NSCFConstantString;値= 2。

文字列の値を数値に強制するのが欲しいですが、そうしたくありません。私はcoerceValueForFbFloorsを実装しようとしました:しかし、それはiOSではなくMac OS Xでのみ利用可能です。

アイデア?

答えて

0

NSNumberの実際のインスタンスをsetValueに渡す必要があります。何かのように:

[b setValue [NSNumber numberWithInt:2] forKey:@ "fbFloors"];

データが文字列として表示されている場合は、NSNumberFormatterを使用して最初にNSNumberに変換できます。あなたは各非文字列属性のための方法を持っている

+0

私がこれを避けることを望んでいたのは、それを直接コーディングするのを避けることができるためでした。さまざまなタイプのフィールドがありますが、それらはすべてテキストフィードから入ってくるので、私はKVCが手動で各フィールドに何が起こるかをコードなしでタイプを強制することができることを期待していました。私は "fbFloorsString"のようなフィールドを追加することを考えていましたが、それは私の変換を行いますが、私はもっと自動化を望んでいました。 – johnnyb

1

あなたはこのような何かをした場合...

- (NSNumber*)fbFloorsValue:(NSString*)valueString 
{ 
    return [NSNumber numberWithInteger: [valueString integerValue]]; 
} 

。そして、あなたは...という変数にあるとあなたの値(「2」)と呼ばれる変数である

あなたのキー(「fbFloors」)を想定し...一般的な方法でこれらの値を設定すると

id valueObject; 
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@Value:", key]); 
if (selector && [self respondsToSelector:selector]) { 
    valueObject = [self performSelector:selector withObject:value]; 
} else { 
    valueObject = value; 
} 
Building * b = [NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:ctx]; [b setValue:valueObject forKey:@key]; 
関連する問題