Kotlin 如何使用缩写形式重写属性设置器?

Kotlin 如何使用缩写形式重写属性设置器?,kotlin,Kotlin,我只想用缩写形式覆盖默认设置器,但我失败了: class MyViewModel: ViewModel() { var progress: Int = 0 set(value) = MathUtils.clamp(value, 0, 100) } 它显示必需:单位,但找到:Int 我做错了什么?属性设置器是属性的实际设置器,缩写形式只是一种简化形式,让函数返回单个表达式的结果 set(value) { field = MathUtils.clamp(value,

我只想用缩写形式覆盖默认设置器,但我失败了:

class MyViewModel: ViewModel() {
    var progress: Int = 0
        set(value) = MathUtils.clamp(value, 0, 100)
}
它显示
必需:单位,但找到:Int


我做错了什么?

属性设置器是属性的实际设置器,缩写形式只是一种简化形式,让函数返回单个表达式的结果

set(value) {
    field = MathUtils.clamp(value, 0, 100)
}
现在,
field=value
是赋值,而不是表达式,因此不能在这里使用。但是,如果您真的想用更短的形式实现它,那么仍然可以使用更详细的形式

set(value) = run { field = MathUtils.clamp(value, 0, 100) }

setter不应该返回值。@BoristheSpider,似乎我刚刚得到,这个表单用于将lambda设置为setter。我认为这是一个模拟的
set(value){field=value}
@boristesspider,谢谢!在lambda中以一个简短的函数形式分配一个字段值让我有点发抖…@boristesspider在生产代码中不应该做什么,但这是可能的,因此在本文中值得注意。您可以执行
set(value)=run{field=MathUtils.clamp(value,0100)}
但是就像使用
let
一样,它只会使事情变得更长。@ErwinBolwidt但是
let
更好。Thanksbetter使用
字段=值。强制输入(01100)