4

不変/可変タイプの2セットがあります。

@class AAA;
@class BBB;

@class MutableAAA;
@class MutableBBB;

@interface AAA : NSObject
@property (readonly,nonatomic,copy)    BBB*    bbb;
@end

@interface BBB : NSObject
@property (readonly,nonatomic,copy)    AAA*    aaa;
@end

@interface MutableAAA : AAA
@property (readwrite,nonatomic,copy)   MutableBBB*    bbb;
@end

@interface MutableBBB : BBB
@property (readwrite,nonatomic,copy)   MutableAAA*    aaa;
@end

Objective-C は戻り型の共分散をサポートしているため、これは完全に合法ですが、問題は 2 つのクラスが相互に参照していることです。定義する前にMutableBBBが のサブクラスであることをコンパイラに知らせる方法がわかりません。BBB

もちろん、これを回避するためにカテゴリにフォールバックできますが、これは追加のメソッドではなく必須のクラス定義の一部であるため、プライマリ インターフェイス本体でこれらを定義したいと考えています。

現在、Clang は警告を生成しています。警告なしでこれを行うにはどうすればよいですか?

アップデート

私の意図は、可変クラスを公開して、オブジェクト ツリーのインプレース編集を可能にすることです。readonly/readwrite実際には関係ありません。避けたい2つの選択肢があると思います。

  • カテゴリを使用しています。
  • 分離された変更可能なバージョン アクセサーを追加します。( の-mutableBytes方法と同様NSMutableData)

この相互参照サブクラス化を可能にする、まだ知らない未知の機能があるかどうかを知りたいだけです。

4

1 に答える 1

4

最近の言語の進歩のおかげで、これは見た目よりも簡単な質問です。これこそまさに、クラス拡張が存在する理由です。要点を説明するために、インターフェイスと疑似メソッド ファイルを定義しました。

//  CFIAAAsAndBBBs.h

@class AAA;
@class BBB;

@interface AAA : NSObject
@property (readonly,nonatomic,copy)    BBB*    bbb;
@end

@interface BBB : NSObject
@property (readonly,nonatomic,copy)    AAA*    aaa;
@end

@interface MutableAAA : AAA
@end

@interface MutableBBB : BBB
@end

まず、ヘッダーに加えた変更に注目してください。readwrite プロパティをヘッダーで公開する代わりに、それらを実装ファイルに移動します。それらを他のオブジェクトに公開する必要がある場合は、対応する変更可能なオブジェクトの代わりに、定義したスーパークラスreadwriteを使用して別のプロパティセットを宣言するだけです。そのようにして、可変性を公開することを回避し、内部的に必要な場合は、後でクラス拡張でプロパティを安全に再宣言できます。内部プロパティといえば、m ファイルは次のとおりです。readwritereadwrite

//  CFIAAAsAndBBBs.m

#import "CFIAAAsAndBBBs.h"

@interface MutableAAA ()
@property (readwrite,nonatomic,copy)   MutableBBB*    bbb;
@end

@interface MutableBBB ()
@property (readwrite,nonatomic,copy)   MutableAAA*    aaa;
@end
//...

これ以上の警告はありません。誰もが勝者として立ち去ります。

于 2013-06-28T04:20:17.673 に答える