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)]
}
}
私は、ドキュメントを読んで、私が行うために必要なものを考え出す苦労しました。これで完全にクリアになりました。ありがとう! –
JavaFXスタイルのCSSをサポートするために、最初のオプション(自動変換なし)を使用しました。 'var fontSize:Any?マップ(プロパティ、 "-fx-font-size") ' –