0

NSManagedObjectのセッターをオーバーライドして、別の型のオブジェクトを渡し、変換を行ってからプロパティを設定できるようにしようとしています。このようなもの:

- (void)setContentData:(NSData *)contentData
{
    NSString *base64String;
    // do some stuff to convert data to base64-encoded string
    // ...
    [self willChangeValueForKey:@"contentData"];
    [self setPrimitiveValue:base64String forKey:@"contentData"];
    [self didChangeValueForKey:@"contentData"];
}

したがって、この場合、contentDatamy のフィールドは でNSManagedObjectありNSString *、セッターが を受け入れ、NSData *これを に変換しNSString *てモデルに保存できるようにしたいと考えています。ただし、これを実行しようとすると、 を に代入しようとすると、コンパイラから警告が表示されNSData *ますNSString *

myObject.contentData = someNSData;

-> Incompatible pointer types assigning to 'NSString *' from 'NSData *__strong'

これについてもっと良い方法はありますか、それともセッターを完全に避けて、コンパイラーの警告なしNSData *にフィールドを渡して設定できるカスタム「セッター」を作成する必要がありますか?NSString *

4

2 に答える 2

3

これは、ツールやフレームワークとの戦いが重要なデザイン臭である例だと思います。クラスの基本的なプロパティの予想されるデータ型をオーバーライドしようとするというこの概念から撤退してください。

サブクラス化している NSManagedObject があなたの管理下にあるかどうかは言いませんでした。NSString 以外のタイプの contentData を管理するためのテンプレートのようなものにすることが設計の一部になる場合は、ルート クラスでタイプ id として宣言し、サブクラスに特化します。それは警告を防ぐはずです。

おそらく、あなたは Cocoaism に従いたいと思うでしょう: サブクラス化しないでください。さまざまな動作を管理するオブジェクト クラスのそれぞれによってプロパティとして保持されるヘルパー クラスにそれを抽出することによって、スーパークラスから探している機能を実現できますか?

于 2012-07-05T18:56:19.587 に答える
1

setContentData: (id) contentData私の " " コメントをフォローアップするには、次のようなことを試してください:

- (void)setContentData:(id)thingToWorkWith
{
    NSString * base64String = nil;

    if(thingToWorkWith isKindOfClass: [NSData class])
    {
       // convert data to string   
    }


    if(thingToWorkWith isKindOfClass: [NSString class])
    {
        // set up base64 string properly
    }

    if(base64String)
    {
        // do some stuff to convert data to base64-encoded string
        // ...
        [self willChangeValueForKey:@"contentData"];
        [self setPrimitiveValue:base64String forKey:@"contentData"];
        [self didChangeValueForKey:@"contentData"];
    }
}

必ず .m ファイルの contentDataの " " ビットを取り除き@synthesize、"getter" メソッドも作成してください。setteridパラメーターに " " を使用しているため、" " 宣言を調整する必要がある場合@propertyがあります少し。私はあなたがやろうとしていることを正確には試していません (つまり、この手法に関する保証はありません)。

于 2012-07-05T18:25:18.513 に答える