在我的代码中,我有以下编译器警告:
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;
@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>
的。