在我的代码中,我收到以下编译器警告:
Initializing 'MyClass *__strong' with an expression of incompatible type '__strong id<MyProtocol>'
我的问题是,如果从类别中删除协议,为什么编译器警告会消失?
就像当我更换
时一样@interface MyClass (CategoryNameHere) <SomeOtherProtocol>
使用
@interface MyClass (CategoryNameHere)
我发现可以重现这种情况的最少代码:
@interface MyWidget ()
@end
@protocol MyProtocol
@end
@protocol SomeOtherProtocol
@end
@interface MyClass <MyProtocol>
@end
@interface MyClass (CategoryNameHere) <SomeOtherProtocol>
@end
@implementation MyWidget
- (MyClass *)sampleMethod:(id<MyProtocol>)v {
MyClass *instance = v;
return instance;
}
@end
编译器警告所在的行
MyClass *instance = v;
答案 0 :(得分:1)
@interface Factory : NSObject @end
@protocol First @end
@protocol Second @end
@protocol Third @end
@interface Base <First, Second> @end
@interface Custom : Base @end
@interface Base (CategoryNameHere) <Second>
@end
@implementation Factory
- (Custom *)sampleMethod:(id<First, Second>)v {
return v;
}
@end
请考虑您提供的一些重命名示例。
您可以通过按Factory
方法的要求添加/删除协议或通过对类的扩展添加/删除协议来使用它。
此示例的基石是裸露的(没有超类)类Base
。
编译器将其视为id<First, Second>
。