Is it a good practice to force developer to comply with a protocol in objective C?

objective-c

Solution

First the "good practice" question:

- Don't make methods required unless they actually are.

Don't make methods optional if they aren't.

Not a critical one, more of an opinion

- Provide a method `initWithDelegate:` if a delegate is required

- I often come across data structures where I don't know that there is a delegate pattern until I investigate. With the specific `init` method, I'm made aware of it earlier.

You can cause warnings at compile time by simply adding the `@required` indicator to your protocol:

@protocol SuperAwesomeProtocol <NSObject>

@required
-(void) requiredMethod1;
-(void) requiredMethod2;

@optional
-(void) optionalMethod1;
-(void) optionalMethod2;

@end

//and making your delegate specific:
@property (nonatomic, assign) id<SuperAwesomeProtocol> delegate;

You can still cause runtime asserts with:

if (!delegate || ![delegate respondsToSelector:@selector(requiredMethod1)])
{
    //Assertion failure
}

Problem

I am developing a simple set of reusable code. I have created a protocol to group a set of methods and ask the user at run time for data. I think that setting a delegate would be mandatory. Can I force the developer at runtime to set the delegate by throwing an assert stating the reason? Is this a good practice to enforce the user of my classes by using asserts? Does it have a design level flaw?

Original source