我尝试连接一些条形码值:
barcodeScanner.process(image)
.addOnSuccessListener {
barcodes ->
if (barcodes.isNotEmpty()) {
val barcode = barcodes.reduce {acc, barcode -> acc + barcode.rawValue() }
debug ("analyze: barcodes: $barcode")
} else {
debug ("analyze: No barcode scanned")
}
}
程式码会产生下列错误:
Type mismatch: inferred type is Unit but Barcode! was expected
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public operator fun Offset.plus(offset: IntOffset): Offset defined in androidx.compose.ui.unit
public operator fun IntOffset.plus(offset: Offset): Offset defined in androidx.compose.ui.unit
Expression 'rawValue' of type 'String?' cannot be invoked as a function. The function 'invoke()' is not found
我一个都不懂。谁能解释一下吗?
特别是最后一条错误信息听起来很奇怪。为什么我要在String
上调用rawValue
呢?变量barcodes
应该是List<Barcode>
而不是List<String>
。
1条答案
按热度按时间l7wslrjt1#
看一下reduce的函数原型:
operation
的两个参数必须具有相同的类型,或者至少必须存在从第二个参数(即,条形码)到第一个参数(acc)的隐式转换。这是必要的,因为
reduce
使用列表的第一个元素作为累加器的初始值。在您的例子中,数组元素是
Barcode
,而累加器是String
。您可能希望使用fold
而不是reduce
。使用fold
,您可以自由选择累加器的类型,因为您显式指定了一个初始累加器值。在您的例子中,它将是空字符串。另请参阅:Difference between fold and reduce in Kotlin, When to use which?