2009-12-16 7 views
18

Kann mir jemand sagen, was die Winkel "<...>" in einer Obj-C-Klasse Schnittstelle tun? So ... http://snipt.net/robhawkes/cocoa-class-interfaceWas sind die spitzen Klammern "<…>" in einer Obj-C-Klasse Schnittstelle für?

@interface MapMeViewController : UIViewController <CLLocationManagerDelegate, 
      MKReverseGeocoderDelegate, MKMapViewDelegate, UIAlertViewDelegate> { ... } 

Aus meiner Sicht sich wie eine Art von Typdeklaration aussehen (unter Berücksichtigung meiner bisherigen Erfahrungen in PHP und JavaScript), wie wir sicherstellen, dass MapMeViewController ist ein CLLocationManagerDelegate, MKReverseGeocoderDelegate, MKMapViewDelegate oder UIAlertViewDelegate

Dokumentation über die @ Interface-Syntax scheint dies nicht zu erwähnen.

Antwort

35

Die spitzen Klammern in einer Klassenschnittstellendefinition gibt die Protokolle an, denen Ihre Klasse entspricht.

Ein Protokoll ist fast wie eine Schnittstelle in Java oder C#, mit dem Zusatz, dass Methoden in einem Objective-C-Protokoll optional sein können.

Zusätzlich in Objective-C können Sie eine Variable, ein Argument oder eine Instanzvariable deklarieren, um auch mehreren Protokollen zu entsprechen. Beispiel

NSObject<NSCoding, UITableViewDelegate> *myVariable; 

In diesem Fall wird die Klasse muss NSObject oder eine Unterklasse sein (nur NSProxy und ihre Unterklassen scheitern würde), und es muss auch zu den beiden NSCoding und UITableViewDelegate Protokollen entsprechen.

In Java oder C# wäre dies nur möglich, indem diese Klasse tatsächlich deklariert wird.

9

Die spitzen Klammern zeigen protocol an. Sie sind analog zu Schnittstellen in anderen Sprachen.

4

Apple-Dokumentation meldet die Verwendung von Klammern; siehe The Objective-C Programming Language zu Kapitel 4, "Ein Protokoll annehmen".

Die Übernahme eines Protokolls ähnelt in gewisser Weise der Deklaration einer Oberklasse. Beide weisen der Klasse Methoden zu. Die Superklassen-Deklaration weist sie geerbten Methoden zu; Das Protokoll weist ihm Methoden zu, die in der Protokollliste deklariert sind. Eine Klasse wird gesagt, ein formelles Protokoll anzunehmen, wenn in seiner Erklärung sie das Protokoll in spitzen Klammern nach dem Ober Namen aufgeführt:

@interface ClassName : ItsSuperclass < protocol list > 

Kategorien adoptieren Protokolle in der gleichen Weise:

@interface ClassName (CategoryName) < protocol list > 
6

Sie können sie auch wie einen Cast in Code verwenden, um dem Compiler mitzuteilen, dass er ein Objekt erwartet, das einem bestimmten Protokoll entspricht.

Verwandte Themen