Почему добавление этого протокола в эту категорию вызывает предупреждение компилятора? - PullRequest
2 голосов
/ 10 июля 2019

В моем коде есть следующее предупреждение компилятора:

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 Ответ

1 голос
/ 10 июля 2019
@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> компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...