10

私は現在Objective-Cを学んでおり、プロトコルでオプションのメソッドに出くわしました。私のバックグラウンドは C# であり、プロトコルを C# インターフェイスに似たものと見なすことができます。

C# インターフェイスがコントラクトを表す場合、インターフェイスを宣伝することで、定義されたメソッドを実装することを意味します。

これを念頭に置いて、なぜオプションのメソッドを定義する必要があるのか​​ 混乱しています。これは中傷でも、Objective-C を弱めようとする試みでもありません。私は Objective-C が大好きです。言語をより深く理解するために、これらのオプションのメソッドの利点を理解したいだけです。

オプションのメソッドが役立つ実世界のシナリオ (サンプル コード付き) を誰かが提供してくれれば、本当にありがたいです。

4

1 に答える 1

14

例を挙げましょう。Flickr API と通信する ObjC クラスがいくつかあります。1 つは呼び出されFKAccount、ユーザーの写真のダウンロード、連絡先リストの取得など、Flickr ユーザーのアカウントに関連する多くのことを行うことができます。

このFKAccountクラスはデリゲート プロトコルを定義しますFKAccountDelegate。このプロトコルは、FKAccountFlickr に対するさまざまなネットワーク操作の成功または失敗に応じて、デリゲートで呼び出される多数のコールバック メソッドを指定します。を使用するすべてのアプリケーションが、実行可能なFKAccountすべての Flickr 操作に関心を持つわけではありませんFKAccount

プロトコルを実装すると主張するすべてのクラスがFKAccountDelegateすべてのメソッドを実装する必要がある場合は、多くのスタブ メソッドが必要になります (FWIW、41 個のメソッドが で定義されていFKAccountDelegateます)。これらのメソッドが@optionalプロトコルで宣言されている場合、デリゲートは、受信する必要のあるコールバックのみを実装する必要があります。

FKAccountクラスは、デリゲート@optionalがプロトコルのメソッドに応答することを次のようにチェックします。

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) {
    [self.delegate accountDidDownloadContacts: self];
}
于 2009-07-09T10:57:09.143 に答える