Kotlin可变属性的扩展函数

我试图设置一个可变属性的扩展函数,所以我可以在扩展函数中重新分配属性。 我想知道这是否可能。

我的目标是使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对象。

可以这样做吗?

不幸的是,你不能在成员属性上定义一个扩展名,并在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对象的引用。 这个解决方案适用于可变对象,虽然它不适合存储不可变对象的属性。

而不是返回一个新的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 }