I have a protocol named MyProtocol. MyProtocol has an required method:
- (NSUInteger)length;
And some other methods.
Now i want to make the NSString class conform to MyProtocol with a category. Like so:
@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end
In this category i implement all methods excluding the 'length' method, because i want the original NSString implementation. I do not want to override it in this particular class.
Now i get a warning because of an incomplete implementation of MyProtocol in the category.
I know there are a few solutions to solve this.
I do not want to use these options because they result in a bad design for the rest of my code.
Option 3 is bad, because of existing direct subclasses will not be conform to the protocol.
Does anybody know how to remove the warning without implementing the length method?
NOTE: The class, category and protocol are just examples. I did encounter this problem with other classes which i could not post about. Thanks
EDIT: Added the third option.
Full Code:
The protocol:
@protocol MyProtocol <NSObject>
- (void) myMethod;
- (NSInteger) length;
@end
The category header:
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface NSString (MyProtocol) <MyProtocol>
@end
The category implementation:
@implementation NSString (MyProtocol)
- (void)myMethod {
}
@end
This results in the following warnings.
Incomplete implementation
Method in protocol not implemented
In this screenshot you can see my warning:
I tried compiling with LLVM GCC 4.2 and the Apple LLVM 3.0 compiler. I also compiled on xcode 4.0.2 and Xcode 4.2. I'm on OS X 10.6.8.
Objective-C uses angle brackets to indicate conformance to a protocol. This example declares a weak property for a generic object pointer that conforms to the XYZPieChartViewDataSource protocol.
You can limit protocol adoption to class types (and not structures or enumerations) by adding the AnyObject or class protocol to a protocol's inheritance list.
You can create objects from classes, whereas protocols are just type definitions. Try to think of protocols as being abstract definitions, whereas classes and structs are real things you can create.
The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of those requirements. But there would be a time when you want to restrict protocols to be adopted by a specific class. In Swift 5, you can do just that.
I cannot reproduce this issue. Can you post code that demonstrates it? The following compiles without warnings on 10.7.
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
- (NSUInteger)length;
@end
@interface NSString (NSStringWithMyProtocol) <MyProtocol>
@end
int main (int argc, const char * argv[]) {
@autoreleasepool {
id<MyProtocol> foo = @"foo";
NSLog(@"%@", foo);
}
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With