2016-04-13 8 views
3

私は財産代議員の周りに頭を抱えようとしています。興味深い事例があります。しかし、カスタムキー(すなわち、「フォントサイズ」)で、私は、デリゲートとしてマップを使用してfontSizeを保存できるようになるKotlin - カスタム名でマップによってプロパティ代理人を作成するには?

class MyClass { 
    val properties = mutableMapOf<String, Any>() 
    val fontSize: Any by MapDelegate(properties, "font-size") 
} 

:それはこのようなものを持つことが可能です。

コードで使用するために変数(fontSize)でアクセスできるCSSプロパティタグなどを格納する場合の具体的な使用例ですが、マップを反復処理するときに正しくレンダリングできる(font-size: 18px;)。

答えて

7

the delegated propertiesに関するドキュメントは、このトピックに関する優れた情報源です。これはおそらく、少し長く読まれる以下の例より:

fun <T, TValue> T.map(properties: MutableMap<String, TValue>, key: String): ReadOnlyProperty<T, TValue> { 
    return object : ReadOnlyProperty<T, TValue> { 
     override fun getValue(thisRef: T, property: KProperty<*>) = properties[key]!! 
    } 
} 

class MyClass { 
    val properties = mutableMapOf<String, Any>() 
    val fontSize: Any by map(properties, "font-size") 
} 

あなたはCSSにKotlinのプロパティ名を変換することにより、少し物事を容易にし、CSSのプロパティ名を入力して回避することができますので、ようなものと同じ属性:

fun <T, TValue> map(properties: Map<String, TValue>, naming:(String)->String): ReadOnlyProperty<T, TValue?> { 
    return object : ReadOnlyProperty<T, TValue?> { 
     override fun getValue(thisRef: T, property: KProperty<*>) = properties[naming(property.name)] 
    } 
} 

object CamelToHyphen : (String)->String { 
    override fun invoke(camelCase: String): String { 
     return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, camelCase) 
    } 
} 

fun <T, TValue> T.cssProperties(properties: Map<String,TValue>) = map(properties, CamelToHyphen) 

class MyClass { 
    val properties = mutableMapOf<String, Any>() 
    val fontSize: Any? by cssProperties(properties) 
} 

上記のサンプルでは、​​GuavaのCaseFormatが使用されています。

あなたのデリゲートがsetterメソッドを実装する必要があります可変特性を持っているしたい場合:

fun <T, TValue> map(properties: MutableMap<String, TValue?>, naming: (String) -> String): ReadWriteProperty<T, TValue?> { 
    return object : ReadWriteProperty<T, TValue?> { 
     override fun setValue(thisRef: T, property: KProperty<*>, value: TValue?) { 
      properties[naming(property.name)] = value 
     } 

     override fun getValue(thisRef: T, property: KProperty<*>) = properties[naming(property.name)] 
    } 
} 
+0

私は、ドキュメントを読んで、私が行うために必要なものを考え出す苦労しました。これで完全にクリアになりました。ありがとう! –

+0

JavaFXスタイルのCSSをサポートするために、最初のオプション(自動変換なし)を使用しました。 'var fontSize:Any?マップ(プロパティ、 "-fx-font-size") ' –

関連する問題