为什么将此协议添加到此类别会触发编译器警告



在我的代码中,我有以下编译器警告:

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>的。

相关内容

  • 没有找到相关文章