Я пытаюсь создать пользовательскую переменную (fooModel) как расширение класса Android Activity. В Swift это было сделано просто как расширение класса для UIViewController, создавая переменную и затем получая к ней доступ в любое время.
Вот расширение, которое работает в Swift:
extension UIViewController {
var fooModel : barFooModel? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.fooModel) as? barFooModel
}
set(value) {
objc_setAssociatedObject(self, &AssociatedKeys.fooModel, value, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
В Котлине я сделал следующее:
var Activity.fooModel: barFooModel?
get() = fooModel as barFooModel
set(value) {
fooModel = value
}
Это вызывает следующую ошибку:
Unresolved reference: fooModel
Одно из автоматически сгенерированных решений - импортировать fooModel, но это кажется неправильным и по-прежнему не устраняет ошибку.
Примечание. Я МОГУ получить доступ к этому расширению переменной через переменную, принадлежащую классу Activity (см. Ниже пример того, как это выглядит), из-за чего кажется, что это ДОЛЖНО работать, мне просто что-то не хватает:
fun <T: Activity, M: BarFooModel> newInstance(context: Context, activityType: T, _fooModel: M): T {
val intent = Intent(context, activityType::class.java) as T
**intent.fooModel = _fooModel** // intent.fooModel IS accessible, based on the extension created.
return intent
}
Я на правильном пути? Что я могу сделать, чтобы соответствовать реализации Swift расширения переменной fooModel?
Заранее спасибо.
Если я правильно понял, это должно выглядеть так:
object AssociatedKeys {
const val fooModel = "fooModel"
}
open class BarFooModel : Serializable
var Intent.fooModel: BarFooModel?
get() {
return getSerializableExtra(AssociatedKeys.fooModel) as BarFooModel?
}
set(value) {
putExtra(AssociatedKeys.fooModel, value)
}
fun <T : Activity, M : BarFooModel> newInstance(context: Context, activityType: T, _fooModel: M): Intent {
val intent = Intent(context, activityType::class.java)
intent.fooModel = _fooModel
return intent
}
Может использоваться намерение для хранения Associated Objects
Я считаю, что решил это! У меня была переменная Intent.fooModel в отдельном классе, чем функция newInstance. (Вот как мы это сделали в iOS). По-видимому, Android предпочитает, чтобы, как вы здесь показываете, все было в одном классе при работе с расширениями. Всегда ли это так? Могу ли я создать расширение в одном классе, которое применяется ко всем остальным? Возможно, если я помещу его в пользовательский класс companionObject, чтобы он действовал как синглтон ... но, боюсь, я заблудился в тех областях, в которых я не должен этого делать. В любом случае спасибо. Ваше решение очень помогло.
Кажется, теперь это работает, когда у меня было время реализовать это. Осталась только одна проблема: Когда я вызываю: intent.fooModel = _fooModel Класс не распознает fooModel и утверждает, что это неразрешенная ссылка. Он предлагает мне импортировать 'fooModel', но не позволяет мне это делать (в любом случае это не имеет смысла). Приветствуются любые дальнейшие идеи! Я буду продолжать пробовать различные идеи ... Как только я смогу запустить код и убедиться, что это решение действительно работает, я обязательно отмечу ваш ответ! Еще раз спасибо.