2

拡張機能でプロパティを再割り当てできるように、変更可能なプロパティに拡張機能を設定しようとしています。可能かどうか知りたかった。

私の目標はDate、簡単にアクセスできる拡張機能を作成することです。例えば:

fun Date.addDays(nrOfDays: Int): Date {
    val cal = Calendar.getInstance()
    cal.time = this
    cal.add(Calendar.DAY_OF_YEAR, nrOfDays)
    return cal.time
}

この関数は、オブジェクトを使用して日付に日数を追加しCalendarます。問題は、この関数を使用するたびに再割り当てするのが混乱する可能性がある新しい日付を返す必要があることです。

私が試したこと:

fun KMutableProperty0<Date>.addDays(nrOfDays: Int) {
    val cal = Calendar.getInstance()
    cal.time = this.get()
    cal.add(Calendar.DAY_OF_YEAR, nrOfDays)
    this.set(cal.time)
}

Date残念ながら、これはオブジェクトでは使用できません。

これを行うことは可能ですか?

4

2 に答える 2

3

new を返しDateてプロパティを更新しようとする代わりにDate、プロパティが既に保持している を変更するだけです。

fun Date.addDays(nrOfDays: Int) {
    val cal = Calendar.getInstance()
    cal.time = this
    cal.add(Calendar.DAY_OF_YEAR, nrOfDays)
    this.time = cal.timeInMillis
}
于 2016-07-11T14:13:05.213 に答える
1

残念ながら、メンバー プロパティに拡張機能を定義して、Kotlin 1.0.3 で流暢に呼び出すことはできません。

拡張機能は、次のように書き直すことができます。

fun <T> KMutableProperty1<T, Date>.addDays(receiver: T, nrOfDays: Int) {
    val cal = Calendar.getInstance()
    cal.time = this.get(receiver)
    cal.add(Calendar.DAY_OF_YEAR, nrOfDays)
    this.set(receiver, cal.time)
}

次の使用法で:

class C(var date: Date) { ... }
val c = C(someDate())

C::date.addDays(c, 123)

バインドされた呼び出し可能な参照 (Kotlin 1.1 でサポートされている可能性が高い)を使用すると、次の構文でこれが可能になります。

c::date.addDays(123)

@MarcinKoziński が示唆するようにDate、プロパティを再割り当てせずにオブジェクトを変更することもできます。

fun Date.addDays(nrOfDays: Int) {
    val cal = Calendar.getInstance()
    cal.time = this
    cal.add(Calendar.DAY_OF_YEAR, nrOfDays)
    this.time = cal.timeInMillis
}

使用法:

class C(var date: Date)
val c = C(someDate())

c.date.addDays(123)

このソリューションでは、変更されたDateオブジェクトへの参照を制御する必要があります。このソリューションは可変オブジェクトには適していますが、不変オブジェクトを格納するプロパティには適していません。

于 2016-07-11T13:53:24.533 に答える