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

时间:2019-07-10 07:35:46

标签: objective-c

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

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;

1 个答案:

答案 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>