我在FooClass
class:
fun foo(id: Int, listener: Listener<JsonElement>) {
enqueue(listener, apiService.getFoo(id))
}
这是界面:
interface Listener<T> {
fun onSuccess(result: T?)
fun onFailure()
}
当我打电话时,我这样做:
FooClass().foo(id, object : FooClass.Listener<JsonElement> {
override fun onSuccess(result: JsonElement?) {}
override fun onFailure() {}
})
我想在拨打电话时简化lambda。像这样:
fun foo {id ->
// Perform onSuccess
// Perform onFailure
}
我知道这是基本的,但我很乱......: - (
非常感谢您的帮助。
答案 0 :(得分:6)
你需要使用一些技巧。
typealias SuccessCallback<T> = (T?) -> Unit
typealias FailureCallback = () -> Unit
inline fun FooClass.foo(id: Int, crossinline success: SuccessCallback<JsonElement?>, crossinline failure: FailureCallback) {
foo(id, object: FooClass.Listener<JsonElement> {
override fun onSuccess(result: JsonElement?) = success(result)
override fun onFailure() = failure()
})
}
现在你应该可以打电话了
FooClass().foo(id,
success = { result: JsonElement? ->
...
},
failure = {
}
)
答案 1 :(得分:1)
感谢@EpicPandaForce,我找到了一个解决方案。就是这样:
fun foo(id: Int, success: (JsonElement?) -> Unit, error: () -> Unit) {
enqueue(apiService.getFoo(id), object : Listener<JsonElement> {
override fun onSuccess(result: JsonElement?) = success(result)
override fun onFailure() = error()
})
}
我重构了 enqueue
函数的参数顺序,以便更具可读性。
调用该函数就像这样简单:
FooClass().foo(id,
success = { result ->
// Handle success result
},
error = {
// Handle error
}
)