Я хочу предоставить контекст для этого вопроса.Я видел уникальные решения, в которых люди создают делегатов, которые будут читать / писать из SharedPreferences вместо вспомогательного поля.Чтобы сделать это для строки, например:
class SharedPrefsString(private val sharedPrefs: SharedPreferences) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return sharedPrefs.getString(property.name, "")
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
sharedPrefs.edit().putString(property.name, value).apply()
}
}
var myString: String by SharedPrefsString(myPrefs)
Однако я надеялся, что смогу сделать то же самое с универсальным перечислением, так как все перечисления имеют метод valueOf(string)
, но нижеприведенное не делаетт работа.В комментариях я добавил несколько вещей:
class SharedPrefsEnum<T : Enum<T>>(private val sharedPrefs: SharedPreferences) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
// Doesn't work, can't reference T, which makes sense.
// return T.valueOf(sharedPrefs.getString(property.name, ""))
// Can't use reified type here, which makes sense.
// return enumValueOf<T>(sharedPrefs.getString(property.name, ""))
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
sharedPrefs.edit().putString(property.name, value.name).apply()
}
}
var myEnum: MyEnum by SharedPrefsEnum(myPrefs)
Возможно ли что-то подобное?