2

NSKeyValueCodingが処理できる構造体タイプの属性については、Appleのドキュメントで説明されているCoreDataアクセサーパターンを使用します

たとえば、NSRange構造体をTransformableタイプのコアデータモデルで指定できます。次に、次の形式のNSManagedObjectサブクラスでアクセサーを提供することにより、クライアントのNSValueリグマロールを回避できます。

インターフェース:

@property(assign, nonatomic) NSRange range;

実装;

- (NSRange) range {

    [self willAccessValueForKey:@"range"];
    NSRange retVal = range;
    [self didAccessValueForKey:@"range"];

    return retVal;
}

- (void)setRange:(NSRange)aRange {

    [self willChangeValueForKey:@"range"];
    range = aRange;
    [self didChangeValueForKey:@"range"];
}

ただし、Mogeneratorによって生成されたNSManagedObjectサブクラスは、Transformable属性をNSObjectプロパティとして宣言するため、クライアントはNSValueを取得/設定する必要があります。

(1)一時的なバッキング属性をいじるのではなく、単純なTransformableパターンを維持し、(2)Mogeneratorの「マシン」クラスの編集を回避しながら、mogeneratorでこの状況を処理するための最良の方法は何ですか?

4

5 に答える 5

1

これに対処する究極の方法は、以前に受け入れられた回答でsccが提案したように、mogeneratorテンプレートファイルを変更することです。(a)変換可能な属性のアクセサーを適切なタイプ(この場合はNSRange)に変更してから、(b)適切なKVOメソッド呼び出しを使用してアクセサーを追加する必要があります。

それは私が今どのように行うべきかを理解する時間があるよりも多いので、私の一時的な手段は次のとおりです:

  • 属性のuserInfodict(Core Dataエディター内)に、値NSValueを指定してattributeValueClassNameキーを追加します(ジェネレーターのアクセサーがNSObjectではなくNSValueになるようにするため)。
  • 人間が編集可能なmogeneratorの出力で、新しい名前(rangeValueやsetRangeValueなど)を除いて、質問のようなアクセサーを追加します。基になる値は引き続き永続化されたNSValueですが、私のアクセサーがKVOとボックス化/アンボックス化を処理します。

理想的ではありませんが、mogeneratorマシンファイルを編集しなくても、強く型付けされたアクセサーを取得できます。

于 2012-03-07T10:40:09.483 に答える
0

NSObjectモデルオブジェクトジェネレータがジョブを終了した後、タイプを必要なタイプに変更するだけです。その後、コンパイラの警告は表示されないはずです。

ところで、変換可能な属性を定義した後に管理対象オブジェクトモデルジェネレーターを実行すると、取得できませんがNSObjectid。警告はありません。

于 2012-02-16T06:58:17.773 に答える
0

mogeneratorが使用するテンプレートファイルを変更できますか?(私は思う)スカラー値から離れていれば、NSObject *の代わりに安全に使用できますid

于 2012-02-27T13:41:53.297 に答える
0

マシンテンプレートファイルを編集する場合は、次の条件付きから特殊なケースまで、変換可能なNSRange属性を使用してください。

<$if Attribute.hasTransformableAttributeType && Attribute.objectAttributeClassName == "NSRange" $>

マシンテンプレートのヘッダーファイルを変更した方法は次のとおりです。https://gist.github.com/2414047

于 2012-04-18T14:50:29.740 に答える
0

ドキュメントの間違った部分を読んでいます。ここを見てください:

NSRange変換する必要はありません。これらすべての基本構造には、次のようなメソッドがあります。

NSRangeFromString();
NSStringFromRange();

rangeAsStringしたがって、shadowプロパティをタイプの""のようなものとして定義しますNSString

MOサブクラスでは、値を適切に変換して保存する方法についてのドキュメントに従い、次のような場合にオブジェクトがダーティになったことをコアデータが認識できるようにします。

myObject.range = NSMakeRange(0,5);
于 2012-06-08T03:05:57.037 に答える