6

Ich habe gelesen, dass Sie versuchen sollten, @class in Ihrer Headerdatei anstelle von #import zu verwenden, aber das funktioniert nicht, wenn Ihr @class ein Delegatprotokoll enthält, das Sie versuchen benutzen.Verwenden von @class, um Zugriff auf eine Delegatprotokolldeklaration zu erhalten

MyView.h

#import <UIKit/UIKit.h> 
@class MyCustomClass; // <-- doesn't work for MyCustomClassDelegate, used below 

@interface MyView : UIView <MyCustomClassDelegate> 

@end 

Ich glaube, ich bin mit Blick auf etwas, ist es eine Möglichkeit, @class zu bekommen in dieser Situation zu arbeiten, oder ist #import meine einzige Wahl?

Bearbeiten: Eine davon umgehen, ist natürlich, Ihre #import MyCustomClass und MyCustomClassDelegate im privaten Schnittstelle Abschnitt der .m-Datei anstelle der .h-Datei.

Antwort

5

Sie können nur vorwärts deklarieren ein Protokoll in der gleichen Header-Datei für die Verwendung in der Methode Rückgabewerte oder Parametertypen. In Ihrem Fall möchten Sie, dass die Klasse dem Protokoll entspricht, also wird es nicht funktionieren, da es Verhalten definiert, das der Klasse selbst hinzugefügt wird (d. H. Die Methoden, auf die es antworten wird).

Daher müssen Sie das Protokoll #import. Aus diesem Grund ist es wahrscheinlich eine gute Idee, das Protokoll und die Klasse in separate Dateien aufzuteilen. Weitere Informationen finden Sie unter this answer.

+2

Nicht Pits einstufen, aber um genauer zu sein: Sie können ein Protokoll weiterleiten, aber nicht, wenn Sie eine Klasse deklarieren, die diesem Protokoll entspricht (in dieser Header-Datei). Wenn das Protokoll nur für eine Methodenrückgabe oder einen Parametertyp benötigt wird, können Sie es deklarieren (und dazu "@protocol MyProtocol;" statt "@class MyProtocol;" verwenden). – erikprice

+0

Aktualisiert, danke für die Klarstellung! – Senseful

4

MyCustomClassDelegate ist ein Protokoll, keine Klasse. Wenn der Compiler über die Existenz von MyCustomClass informiert wird, erfährt er nichts über die Existenz des Protokolls.

2

Sie müssen Ihre Delegierten Protokoll vor der Klasse deklarieren:

MyCustomClass.h:

#import <UIKit/UIKit.h> 
@class MyCustomClass; 

@protocol MyCustomClassDelegate <NSObject> 

- (void)myCustomClass:(MyCustomClass *)customClass 
       didBlah:(BOOL)blah; 

@end 

@interface MyCustomClass : NSObject <MyCustomClassDelegate> 

@end 

Und Sie können sogar nicht @protocol verwenden, um den Delegaten Protokoll voraus zu erklären; Der Compiler muss die vollständige Erklärung sehen, Ihre daher @class ändern für eine #import:

MyView.h:

#import <UIKit/UIKit.h> 
#import "MyCustomClass.h" // the compile now knows what MyCustomClassDelegate is 

@interface MyView : UIView <MyCustomClassDelegate> 

@end 
+1

ehhh? Ich denke, er meint, dass das Protokoll bereits in der Klasse deklariert ist, auf die er verweist, so dass es nicht erneut deklariert werden muss. – Bot

+0

@Bot Ah, ja, er muss nur "# import" anstatt "@ class" verwenden. Mein Fehler. – trojanfoe

9

können Sie @protocol verwenden, um ein Protokoll zu übermitteln erklären, wenn Sie es nur für Variablen müssen wie folgt aus:

@protocol MyProtocol; 

@interface MyClass { 
    id<MyProtocol> var; 
} 
@end 

in Ihrem Fall Ihre Klasse zu einem Protokoll zu entsprechen versucht, so ist es darüber wissen müssen. Ich denke, Ihre Optionen sind, das Protokoll in eine eigene Datei zu teilen und diesen Header zu importieren, oder das Protokoll in diesem Header über der Klassendeklaration zu deklarieren, die es verwendet.

Es ist normalerweise nicht viel zu sorgen über # einschließlich einer Klassendatei, wenn es Teil eines Frameworks usw.

Verwandte Themen