Наблюдение значения ключа относительно Объекта Протокола: Предупреждения компилятора на addObserver:

Я попробовал ваш код в тестовом проекте с примерами сущностей, и это сработало. Поскольку вы не опубликовали фактическое описание ошибки, выполните / убедитесь в следующих шагах и повторите попытку.

Добавьте следующие зависимости в build.gradle

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

Если вы используете RxJava для комнаты, добавьте также следующую строку

implementation "androidx.room:room-rxjava2:$room_version"

Примените [ 114] плагин

apply plugin: 'kotlin-kapt'

очистить и собрать.

Если проблема не устранена, попробуйте отредактировать вопрос с помощью трассировки стека logcat.

10
задан Brian Ferris 12 April 2009 в 01:39
поделиться

2 ответа

Настоящим раздражением является предупреждение компилятора при вызове addObserver:

 предупреждение: '-addObserver: forKeyPath: options : context: 'не найден в протоколе (ах)

Метод «addObserver» определен в категории для NSObject:

 @interface NSObject (NSKeyValueObserverRegistration)

Есть ли способ заставить XCode сбросить это предупреждение?

Xcode (строчная c) просто показывает вам предупреждение; в первую очередь это GCC, компилятор, который выдает предупреждение.

Вы путаете NSObject класса с протоколом NSObject протокола . Класс NSObject, в частности, соответствует протоколу NSObject, но протоколы не имеют своего отношения к классам. Ваш протокол StopsSource, будучи протоколом, наследуется от протокола NSObject, а не от класса NSObject.

Ваше объявление охватывает только эти два протокола, а не какой-либо конкретный класс, поэтому оно не включает ничего, кроме тех протоколов, которые класс NSObject может реализовать (например, КВО). Вот почему вы получаете предупреждение.

Как сказал вам Джейсон Коко в своем комментарии к вашему вопросу, решение состоит в том, чтобы изменить объявление для использования класса NSObject и вашего протокола:

NSObject <StopsSource> *source = …;
13
ответ дан 3 December 2019 в 23:51
поделиться

Я думаю, вы можете запутаться в том, что делает протокол; он просто определяет набор операций, которые могут быть реализованы другим классом.

Единственное, что в вашем протоколе - это свойство.

Кроме того, почему вы объявляете это соответствующим протоколу NSObject? Вам не нужно этого делать, потому что если у вас есть класс, который принимает ваш протокол, он будет наследоваться от NSObject и будет соответствовать. то есть

@interface YourClass : NSObject <StopSource> {
    // etc
@end
0
ответ дан 3 December 2019 в 23:51
поделиться