2013-01-03 14 views
5

CoreDataを使用してiPhoneアプリケーションをプログラミングし、コードベースをできるだけ保守可能なものにしようとしました。私は、コンパイラがnameかどうかを確認するためになるだろうCoreData NSPredicateの属性名

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", Person.name, aName]; 

その方法:代わりに、私のようなものを書くことができるようにしたいと思い

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", aName]; 

:したがって、私は、次のようなハードコードされた文字列を避けたいですエンティティPersonの財産であり、スペルミスを防止します。 プロパティnameタイプPerson

PersonタイプNSManagedObjectのビーイングと、自動的に私のMyApp.xcdatamodeldからのXcodeによって生成されたオブジェクトの上で見つかりません:私はコンパイル時に次のエラーを取得していますけれども、このコードで

nameは私がGoogleで検索して、この特定の問題への答えのためにすでにかなり多くのことをアップしましたSOed Person

エンティティの単純な文字列属性です。私もproperty_getNameNSPropertyDescriptionを使用してみました。

ご協力いただきありがとうございます。

Joss

+0

このようには動作しませんが、あなたは '@" name "'を '@ K'引数に指定する必要があります。 – Joe

答えて

4

次の3つのstructヘッダで宣言されたのを取得します。たとえば、エンティティの名前がPersonで、属性がnameの場合は、PersonAttributes.nameを使用してそのキーにアクセスできます。これにより、アプリケーションコードにハードコードされたキー名があるのを避けることができます。

+0

私はそれがデフォルトのテンプレートに含まれていたのか分かりませんでした。それは確かに行く方法です。素晴らしい答え!ジョス、あなたはこの答えを受け入れるべきです(左のチェックマークの輪郭をクリックすると、それが受け入れられたとマークされます)。 –

+0

@KendallHelmstetterGelnerありがとうございます! –

+0

@CarlVeazey:素敵な答え!まさに私が探していたもの。それは本当に幸せなので、私の最初の質問だった! – Joss

4

まず、 "name"はクラスインスタンスではなく、クラスレベルのプロパティであるため、Person.nameは存在しません。

コンパイラでチェックされたメソッド名から文字列への実際のパスがわからない。下位レベルのメソッドを使用して、クラスからメソッドシグネチャにアクセスし、それらから文字列を取得できますが、それらの開始点はチェックされていない文字列(CまたはObjC)です。

一般的に、述部を使用すると、名前が間違っているとエラーが発生するため、述部を使用するすべてのテストでメソッド名が正しいことが確認されます。

モデルで使用するデータオブジェクトを生成するには、Mogeneratorを使用する必要があります。その場合、テンプレートを変更して "stringForMethodNamed * Name *"のようなメソッドを追加し、それをフォーマットされた述部のパラメーターの1つとして組み込むことができます。 EntityNameAttributesEntityNameRelationships、およびEntityNameFetchedProperties - あなたが自動生成されたクラスでは、Kendallの優れた提案につき、Mogeneratorを使用する場合

+0

包括的な回答Kendallに感謝します!私は今、Mogeneratorについて今日聞いたことがあります;-)。私はそれを見ています。私はあなたの答えを投票することができたらいいと思う。私はそうだと思いますが、十分な評判はありません。 – Joss

+0

心配する必要はありません。あなたが答えを受け入れると、評判が上がります。 –

関連する問題