Swift to Kotlin - Расширения

Я пытаюсь создать пользовательскую переменную (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?

Заранее спасибо.

1
0
536
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понял, это должно выглядеть так:

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 = _fooModel Класс не распознает fooModel и утверждает, что это неразрешенная ссылка. Он предлагает мне импортировать 'fooModel', но не позволяет мне это делать (в любом случае это не имеет смысла). Приветствуются любые дальнейшие идеи! Я буду продолжать пробовать различные идеи ... Как только я смогу запустить код и убедиться, что это решение действительно работает, я обязательно отмечу ваш ответ! Еще раз спасибо.

Keith Kowalski 22.08.2018 08:10

Я считаю, что решил это! У меня была переменная Intent.fooModel в отдельном классе, чем функция newInstance. (Вот как мы это сделали в iOS). По-видимому, Android предпочитает, чтобы, как вы здесь показываете, все было в одном классе при работе с расширениями. Всегда ли это так? Могу ли я создать расширение в одном классе, которое применяется ко всем остальным? Возможно, если я помещу его в пользовательский класс companionObject, чтобы он действовал как синглтон ... но, боюсь, я заблудился в тех областях, в которых я не должен этого делать. В любом случае спасибо. Ваше решение очень помогло.

Keith Kowalski 22.08.2018 08:31

Другие вопросы по теме