2

オブジェクトが複数のプロトコルをサポートするようにすることについて多くの質問を見つけることができますが、@property がサポートできるかどうかを確認するものはありません。たとえば、次のプロパティを持つクラスがあります。

@property (strong) id dataSource;

ここで渡されたオブジェクトは UITableViewDataSource プロトコルをサポートしているため、ARC で警告なしで問題なく割り当てることができます。

self.tableView.dataSource = self.dataSource;

CustomControllerSearchDelegate という名前の検索用の別のプロトコルも実装したいと思います。ただし、ランダムに他のメソッドを呼び出し始めると、当然のことながら ARC が不平を言い始めます。したがって、オブジェクトでそれを定義し、プロパティがそれをサポートするようにするプロトコルの道をたどります。これにより、テーブル データ ソースへの割り当てで問題が発生します。それで、主な質問に、私はこれを行うことができますか:

@property (strong) id <UITableViewDataSource, CustomControllerSearchDelegate> dataSource;

そうでない場合、適切な代替手段は何ですか?

または、このコンパイラ警告を削除するために何かをキャストする正しい方法は何ですか:

Assigning to 'id<UITableViewDataSource>' from incompatible type
'id<PickerViewControllerDataSource>'

これが不十分な説明である場合はお詫び申し上げます。:/

- 編集 -

したがって、私のプロトコルは次のように定義されています。

@protocol PickerViewControllerDataSource <UITableViewDataSource>

プロパティは次のように定義されています。

@property (strong) id <PickerViewControllerDataSource> dataSource;

それでも、コンパイラは次のエラーをスローします。

No known instance method for selector 'objectAtIndexPath:'

- 編集 -

上記のカスタム プロトコルで宣言されています。宣言は次のようになります。

@protocol PickerViewControllerDataSource <UITableViewDataSource>

- (id)objectAtIndexPath:(NSIndexPath *)indexPath;

@optional

- (void)searchDataWithString:(NSString*)string;
- (void)cancelSearch;

@end

ありがとうございました。

4

1 に答える 1

5

次のように、他のプロトコルを組み込んだプロトコルを作成できます。

@protocol MyDataSourceProtocol <UITableViewDataSource, CustomControllerSearchDelegate>
@end

Objective-C プログラミング ガイドから:

クラスがプロトコルを採用するために使用するのと同じ構文を使用して、1 つのプロトコルに他のプロトコルを組み込むことができます。

@protocol ProtocolName < プロトコル リスト >

プロパティdataSourceは次のように定義されます。

@property (strong) id <MyDataSourceProtocol> dataSource;

または、プロトコルにCustomControllerSearchDelegateプロトコルを組み込むことができUITableViewDataSourceます。

@protocol CustomControllerSearchDelegate <UITableViewDataSource>
  ... new methods here ...
@end

この場合、dataSourceプロパティは次のように定義されます。

@property (strong) id <CustomControllerSearchDelegate> dataSource;

私は個人的に後者のアプローチを好みます。

于 2012-05-11T10:19:07.547 に答える