NSObjectプロトコルにはストックプロトコルテンプレートが付属していますが、プロトコルの実際の実装に必要なものすべてではないようです。それを残すことは、絶対に何も変えないようです。それで、プロトコルがそれを継承することが本当に必要なのでしょうか、それとも不必要なアドオンですか?必須プロトコルはNSObjectプロトコルに準拠していますか?
答えて
に準拠知らない
typedef struct objc_object {
Class isa;
} *id;
として定義されているのに対し、NSObject
が
@interface NSObject <NSObject> {
Class isa;
}
として定義されます私のプロトコルは<NSObject>
に準拠していませんでした。それはうまく動作します。しかし、しばしば迷惑になることがあります。最も一般的な煩さはrespondsToSelector:
をNSObject*
(プロトコルの全ポイントを敗北させる種類)にキャストせずに使用できないことです。それは@optional
がなかったのでObjC1の日には戻っていませんでしたので、私たちはそれについて心配していませんでした。(@optional
がないとプロトコルがあまり役に立ちませんでした。その後、ObjC2は、オプションのメソッドの素晴らしい追加と一緒に来て、突然respondsToSelector:
が重要です。私たちのほうが遅かったのですが、プロトコルが<NSObject>
に準拠するようにすれば、人生ははるかに簡単だったことがわかりました。幸いにも、これがXcodeに移行しました。これにより、誰もがより便利な方法で簡単に操作できるようになりました。
しかし、いいえ、あなたはそれをする必要はありません。多くの場合重要ではありません。しかし、それをしない理由はあまりないので、私はそれをお勧めします。
必ずしもそうではありません。デリゲートは単なるヘルパーオブジェクトです。唯一の要件はデリゲートクラスが配置する要件です。特定のデリゲートの要件を正式化する場合は、正式なプロトコルを作成します。つまり、@protocol
ディレクティブを使用してプロトコルを宣言します。 NSObjectのプロトコルに準拠することは、これらの要件のいずれかである場合、あなたはあなたのプロトコルがそれを採用することができます:言っ
@protocol MyDelegateProtocol <NSObject>
//...
@end
が、私はおそらくNSObjectのかNSProxyに由来していないデリゲートを作成するために、どのような理由が表示されません、これらのクラスはすでにNSObjectプロトコルに準拠しています。
すべてのオブジェクトがサブクラスNSObject
になっているわけではありませんので、そのようなオブジェクトがあなたのプロトコルに準拠することを期待していれば、必ずしもNSObjectに準拠する必要はありません。
NSObjectに準拠オブジェクトが基本に準拠していることをコンパイラに知らせてください。NSObject Protocol Referenceをチェックしてください。私はNSObjectに準拠しているとは言わずに、どのように私はこれに従っていることをコンパイラが知っていますか?
id
がそうid
ため、コンパイラは、それがI(など長年にわたりNSObject
推奨事項であり、必須ではありません。 Appleの公式文書ProgrammingWithObjectiveC.pdfによる
それは上記で定義されていますようあなたがプロトコルに準拠ID に
respondsToSelector:
メソッドを呼び出すしようとすると、コンパイラ エラーが発生しますそのための既知のインスタンスメソッドがないことを示します。 のIDをプロトコルに設定すると、すべてのタイプのチェックが戻ってきます。 指定されたプロトコルで定義されていないメソッドを呼び出そうとすると、 というエラーが発生します。コンパイラエラーを回避する1つの方法は、 カスタムプロトコルにNSObjectプロトコルを採用するように設定することです。
が上記で定義されていますようなプロトコルは、NSObject
プロトコル適合せずプロトコルです。一例として、
、それがNSObjectの行動の一部を別のプロトコルに そのクラスのインターフェースから分割された(NSObjectのプロトコルに に準拠するためにあなたのプロトコルを定義するのがベストプラクティスです。NSObjectクラス を採用NSObjectプロトコル)。
- 1. ViewControllerがNSObjectプロトコルに準拠していません
- 2. CBCentralManagerDelegateプロトコルに準拠
- 3. HKWorkoutSessionDelagateプロトコルに準拠
- 4. Swift3:タイプ「NSObjectのは」プロトコルに準拠していない「URLAuthenticationChallengeSender」Swift3「NSURLAuthenticationChallengeSender」は、
- 5. MacRuby:プロトコルに準拠する
- 6. Hashableプロトコルに準拠していますか?
- 7. 実際にプロトコルに準拠していないプロトコル機能の実装
- 8. タイプ 'MainVC'はプロトコル 'UIViewControllerPreviewingDelegate'に準拠していません
- 9. タイプ 'AnyObject'はプロトコル 'Hashable'に準拠していません
- 10. タイプviewcontrollerはプロトコルuitableviewdatasourceに準拠していません
- 11. クラスがプロトコルに準拠していません。どうして?
- 12. コレクションビューのデリゲートが別のプロトコルに準拠しています
- 13. Swiftのプロトコル拡張オブジェクトがクラスでプロトコルに準拠する
- 14. クラスがプロトコルに準拠しているかどうかをチェック
- 15. タイプCCCがプロトコル 'NSObjectProtocol'に準拠していません
- 16. タイプ 'Any'がプロトコル 'Sequence'に準拠していません
- 17. スイフト3:AppDelegateがプロトコルGIDSignInDelegateに準拠していません
- 18. タイプUiViewControllerがプロトコルxxxに準拠していません
- 19. カスタムビューがプロトコルUICollectionViewDataSourceに準拠していません
- 20. タイプ 'customDataObject'がプロトコル 'シーケンス'に準拠していません
- 21. エラー[タイプ "View Controller"がプロトコル "ORKTaskViewControllerDelegate"に準拠していません]
- 22. Argo:タイプがプロトコル 'Decodable'に準拠していません
- 23. クラスがプロトコルRequestRetrierに準拠していません
- 24. タイプMyViewControllerがプロトコル 'STPPaymentContextDelegate'に準拠していません
- 25. クラスがNSCodingプロトコルに準拠していません
- 26. Atlas:タイプがプロトコルに準拠していません。ATLParticipant
- 27. プロトコルに準拠していませんUIPickerViewDataSource
- 28. タイプがプロトコル 'ImagePickerDelegate'に準拠していません
- 29. PickerView - ViewControllerがプロトコルUIPickerViewDataSourceに準拠していません
- 30. ViewControllerがプロトコルUITableViewDataSourceに準拠していません
偉大な答え...しかし、あなたはNSObjectプロトコルで言及している煩わさも 'id obj'で動くようになります。クラスを使ってオブジェクトを参照すると、コンパイラは継承を知るでしょう。おそらくNSObjectで始まります... –