オブジェクトが複数のプロトコルをサポートするようにすることについて多くの質問を見つけることができますが、@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
ありがとうございました。