Вопрос

I've read that you should try to use @class in your header file instead of #import but this doesn't work when your @class contains a delegate protocol that you're trying to use.

MyView.h

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

@interface MyView : UIView <MyCustomClassDelegate>

@end

I think I'm overlooking something, is there a way to get @class to work in this situation or is #import my only choice?

Edit: One work around for this is, of course, declaring your #import MyCustomClass and MyCustomClassDelegate in the private interface section of the .m file instead of the .h file.

Это было полезно?

Решение 2

You can only forward-declare a protocol in the same header file for usage in method return values or parameter types. In your case you want the class to conform to the protocol, so it won't work since it defines behavior that will be added to the class itself (i.e. the methods it will respond to).

Therefore, you must #import the protocol. For this reason, it is probably a good idea to split the protocol and class up into separate files. See this answer for more information.

Другие советы

you can use @protocol to forward declare a protocol if you only need it for variables such as this:

@protocol MyProtocol;

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

In your case the declared class is trying to conform to a protocol so the compiler must know about the protocol methods at this point in order to deduce weather or not the class conforms.

In this case, I think your options are to split the protocol into its own file and #import that header, or declare the protocol in that header above the class declaration that uses it.

MyCustomClassDelegate is a protocol, not a class. Telling the compiler about the existence of MyCustomClass tells it nothing about the existence of the protocol.

You will need to declare your delegate protocol before the class:

MyCustomClass.h:

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

@protocol MyCustomClassDelegate <NSObject>

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

@end

@interface MyCustomClass : NSObject <MyCustomClassDelegate>

@end

And you cannot even use @protocol to forward-declare the delegate protocol; the compiler must see the complete declaration, therefore change your @class for an #import:

MyView.h:

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

@interface MyView : UIView <MyCustomClassDelegate>

@end

You cannot forward declare a protocol you conform to.

If you are using MyView as a MyCustomClassDelegate only in MyView's implementation, you can use Extension in MyView's .m file, such as this:

#import "MyView.h"
#import "MyCustomClassDelegate.h"

@interface MyView () <MyCustomClassDelegate> {

}

@end

@implementation MyView
    ...
@end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top