Я попробовал ваш код в тестовом проекте с примерами сущностей, и это сработало. Поскольку вы не опубликовали фактическое описание ошибки, выполните / убедитесь в следующих шагах и повторите попытку.
Добавьте следующие зависимости в 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.
Настоящим раздражением является предупреждение компилятора при вызове 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 = …;
Я думаю, вы можете запутаться в том, что делает протокол; он просто определяет набор операций, которые могут быть реализованы другим классом.
Единственное, что в вашем протоколе - это свойство.
Кроме того, почему вы объявляете это соответствующим протоколу NSObject? Вам не нужно этого делать, потому что если у вас есть класс, который принимает ваш протокол, он будет наследоваться от NSObject и будет соответствовать. то есть
@interface YourClass : NSObject <StopSource> {
// etc
@end