Función de extensión Kotlin en propiedad mutable

Estoy tratando de establecer una function de extensión en una propiedad mutable para poder reasignar la propiedad en la function de extensión. Quería saber si era posible.

Mis objectives es hacer extensiones de Date para un fácil acceso. Por ejemplo:

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

Esta function agrega el número de días a una date usando un object de Calendar . El problema es que cada vez que tengo que devolver una nueva date puede ser confuso reasignar cada vez que utiliza esta function.

Lo que he intentado:

 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) } 

Lamentablemente, esto no se puede usar en un object Date .

¿Es posible hacer esto?

Desafortunadamente, no puede definir una extensión en una propiedad miembro y llamarla con fluidez en Kotlin 1.0.3.

Su extensión se puede reescribir para que funcione de la siguiente manera:

 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) } 

con el siguiente uso:

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

Con references obligatorias encuadernadas (probablemente compatibles con Kotlin 1.1), esto será posible con la siguiente syntax:

 c::date.addDays(123) 

Como lo sugiere @ MarcinKoziński, también puedes mutar tus objects Date sin reasignar la propiedad:

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

con uso:

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

Con esta solución, debe controlar las references al object Date que está mutado. Esta solución funciona bien con objects mutables, aunque no es adecuada para una propiedad que almacena inmutables.

En lugar de devolver una nueva Date e intentar actualizar su propiedad, puede simplemente modificar la Date que su propiedad ya posee:

 fun Date.addDays(nrOfDays: Int) { val cal = Calendar.getInstance() cal.time = this cal.add(Calendar.DAY_OF_YEAR, nrOfDays) this.time = cal.timeInMillis } 
  • Kotlin delegar propiedad por perezoso que es hilo local
  • Kotlin: ¿cómo hacer una propiedad delegada por map con un nombre personalizado?
  • Crear un propio DataSource con properties de resorte
  • No se puede usar getter personalizado con propiedad delegada
  • ¿Hay un análogo didSet / willSet en Kotlin?
  • Propiedad protegida abstracta Kotlin
  • ¿Cómo implementar una propiedad que proviene de una fuente determinada hasta que se establece directamente en Kotlin?
  • Kotlin: cómo acceder a las properties en el constructor
  • Delegado de propiedad de acceso en Kotlin
  • Kotlin: ¿Cómo puedo evitar el autoboxing (basura) en las properties delegadas?
  • Obtención de información de KProperty dentro de la propiedad delegada fuera de las funciones getValue () y setValue ()