20代 / 独身 / 会社員

デリゲートにselfを指定するときにエラー

下記URLに移転しました。 5秒後に自動的にリダイレクトします

現象

デリゲートにselfを代入したときにwarningが出る

コード

self.hoge.delegate = self;

エラーメッセージ

Assigning to 'id<HogeDelegate>' from incompatible type 'ViewController'

原因

デリゲート先のクラスで<HogeDelegate>プロトコルを採用していなかった

@interface ViewController () // ここに <HogeDelegate> が不足している
@property (nonatomic, strong) Hoge* hoge;
@end

詳細

デリゲートを使用する際には、デリゲート先(実際に処理を実装する方)で</*デリゲート名*/>の形式で、使用するデリゲートを指定し、「このデリゲートを使いますよ〜」ということを表す必要がある。
そうすることで、デリゲート先でデリゲート元のプロトコルが準拠され、selfHogeDelegate型として利用できるようになり、デリゲート元のメソッドを実装して使用することができる。
(というふうに解釈したのだけれど、果たしてこれはあってるのかしら)

今回は、プロトコルの準拠を明示することを怠っていたため、selfViewController型でしかなく、HogeDelegate型のdelegateとは型が一致せず、warningが出た。

解決策

@interface ViewController () <HogeDelegate>
@property (nonatomic, strong) Hoge* hoge;
@end

参考