Необходимость привести к id для вызова isKindOfClass - PullRequest
0 голосов
/ 18 мая 2019

В следующем коде

id<SwiftProtocol> anotherInstanceAsProtocol = [[SomeObjectiveCClassImplementingOBJCSwiftProtocol alloc] init];
[anotherInstanceAsProtocol isKindOfClass:[SomeObjectiveCClassImplementingOBJCSwiftProtocol class]];

я получаю предупреждение "Нет известного метода экземпляра для селектора" isKindOfClass: '"

Если я изменю последнюю строку на

[(id)anotherInstanceAsProtocol isKindOfClass:[SomeObjectiveCClassImplementingOBJCSwiftProtocol class]]

Работает отлично.

Это также работает, если я присваиваю NSObject<SwiftProtocol> вместо id<SwiftProtocol>, но я думаю, что ни того, ни другого не нужно.

Почему этот бросок необходим?

1 Ответ

2 голосов
/ 20 мая 2019

Проблема в том, что ваш SwiftProtocol не наследуется от NSObject (Protocol) , поэтому компилятор Obj-C не знает, что существует метод с именем isKindOfClass:.

Использование id в основном означает, что вы не хотите никакой проверки типов во время компиляции. Реальное исправление должно заключаться в том, чтобы протокол расширялся NSObjectProtocol, убедившись, что все соответствующие ему экземпляры являются обычными объектами Obj-C.

Обратите внимание, что история Objective-C сложна, и не все объекты Objective-C должны наследоваться от NSObject и иметь в наличии isKindOfClass:.

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