Аргументы типа не могут быть применены к неклассовому типу 'id'

Я новичок в ObjectiveC и несколько лет работаю в Swift. Поэтому я не понимаю объясненную ниже ошибку в Xcode:

Аргументы типа не могут быть применены к неклассовому типу 'id'

Мой протокол:

@protocol ExampleProtocol<NSObject>
@required
        
-(NSString *)title;
-(NSString *)album;
    
@end

Моя реализация в файле MyService.h:

@interface MyService : NSObject 
@property (nonatomic, assign, readwrite) id<ExampleProtocol> delegate;
@end

Ошибка возникает в строке:

> @property (nonatomic, assign, readwrite) id<ExampleProtocol> delegate;

Кроме того:

  • Я импортировал требуемый файл .h, в котором код ExampleProtocol находится в файле MyService.m
  • Добавил @class ExampleProtocol; в мой файл MyService.h вверху.

Также пробовал:

  • Создание протокола Swift с импортированием @objc и : class через app-Bridging.h дает тот же результат с тем же сообщением об ошибке.

  • Чистая сборка

  • Чистая папка сборки (удалены производные данные)

    Единственное, что сработало, - это удалить строку из публичного интерфейса в частный. В этом нет смысла. Я не хочу устанавливать делегата из другого класса, и создание общедоступного сеттера, который устанавливает частный делегат, является уродливым обходным путем.

Любое предложение было бы полезным. Хотелось бы понять, почему так происходит. В моем проекте есть много других протоколов, написанных на ObjectiveC, которые отлично работают.


person Darkwonder    schedule 26.12.2017    source источник
comment
Вы пробовали без @class ExampleProtocol;? ExampleProtocol - это протокол, а не класс. Он вам не нужен, если вы импортируете заголовок, но если вы не импортируете заголовок, он должен быть @protocol ExampleProtocol;   -  person Willeke    schedule 26.12.2017
comment
Ваше решение - правильный ответ. Пожалуйста, опубликуйте его как ответ, чтобы я мог принять и проголосовать за него.   -  person Darkwonder    schedule 27.12.2017


Ответы (1)


ExampleProtocol - это протокол, а не класс. Он вам не понадобится, если вы импортируете заголовок. Если вы не импортируете заголовок, он должен быть @protocol ExampleProtocol;

person Willeke    schedule 27.12.2017