2014-09-17 3 views
0

Я пытаюсь написать несколько Котлин обертку Android SharedPreferences и у меня этот код прямо сейчас:испытания типа элемента контейнера в Котлин

class KPreferences(ctx: Context) { 
    val prefs = ctx.getSharedPreferences(ctx.getString(R.string.app_name), Context.MODE_PRIVATE) 

    fun put(key: String, value: Any): Boolean { 
     val editor = prefs.edit() 
     when (value) { 
      is Boolean -> editor.putBoolean(key, value) 
      is Float -> editor.putFloat(key, value) 
      is Int -> editor.putInt(key, value) 
      is Long -> editor.putLong(key, value) 
      is String -> editor.putString(key, value) 
      is Set<*> -> editor.putStringSet(key, value as Set<String>) 
     } 
     return editor.commit() 
    } 

компилируется, но я не могу искать, если Я не могу сделать это лучше, убедившись, что Set содержит только String и другого типа.

Я попытался это:

fun put(key: String, value: Any): Boolean { 
     val editor = prefs.edit() 
     when (value) { 
      is Boolean -> editor.putBoolean(key, value) 
      is Float -> editor.putFloat(key, value) 
      is Int -> editor.putInt(key, value) 
      is Long -> editor.putLong(key, value) 
      is String -> editor.putString(key, value) 
      is Set<*> -> 
       if (value.isEmpty() || value.iterator().next() is String) { 
        editor.putStringSet(key, value as Set<String>) 
       } 
     } 
     return editor.commit() 
    } 

Но, кажется, так безвкусный.

Другой подход будет определение

fun put(key: String, value: Set<String>) 

и удалить последний случай в моей попытке. Мне просто интересно, нет ли здесь какого-либо элегантного решения.

Спасибо!

+0

добавьте тег 'Android' на свой вопрос –

+0

Я не согласен, потому что вопрос действительно касался проверки типа Котлина. Кажется, я встречаюсь с ним в разработке Android, но это совпадение. В любом случае, я добавляю тег, чтобы сделать вас счастливым :) –

+0

или удалить ссылки на Android, а Android-код упрощает все это только в соответствующей части. :-) в любом случае меня радует. –

ответ

1

Во-первых, я хотел бы отметить, что проверка, приведенная в примере, может не гарантировать, что вы поставили в свой редактор набор чего-то другого, кроме строки: если реализация редактора не копирует набор при его установке, один мог пройти в пустой набор, а потом добавить что-то другое, чем строка к нему:

val set = HashSet<Int>() 
prefs.put("...", set) // set is empty, the check lets it through 
set.add(1) 

Generic тип информации не овеществленный, так что вам нужно либо ввести перегрузками для каждого типа вы поддерживаете: Boolean, Float и т. Д., И Set<String>, или вообще не проверяйте надлежащую проверку

+0

Я пытался сделать что-то вроде Scaloid Preferences (https://github.com/pocorall/scaloid/blob/master/scaloid-common/src/main/scala/org/scaloid/common/preferences.scala), но повторное чтение это показывает мне, что Set String также не управляется. Спасибо за анализ! –

0

Я уже создал подобную библиотеку, и она стабильна. Вы можете использовать его, если хотите: KPreferences Он использует совершенно аналогичный подход.