【问题标题】:Map reduce call ambiguous映射减少调用不明确
【发布时间】:2018-07-13 14:49:19
【问题描述】:

我有以下代码:

func update(withSlices newSlices: [HAPieChartSlice], totalValue: CGFloat? = nil, animation: HAPieChartAnimation = .none, animationDuration: TimeInterval = 0.0) {
    let totalValue: CGFloat = totalValue ?? newSlices.map({ $0.value }).reduce(0.0, { $0 }) //Type of expression is ambiguous without more context

上面代码中的reduce 函数出现编译错误。错误是

没有更多上下文的表达类型是模棱两可的

我不确定为什么这段代码不明确,因为 $0.valuetotalValue 都是 CGFloat

其他相关代码:

public struct HAPieChartSlice {
    public let value: CGFloat
    public let color: UIColor
}

为什么这个调用被认为是模棱两可的,我该如何解决它?

【问题讨论】:

    标签: swift reduce


    【解决方案1】:

    我想通了。问题是我没有正确使用reduce 功能。

    reduce 方法定义为:

    func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
    

    而且我不是nextPartialResult 参数中组合结果和元素参数的属性。由于initialResult0.0,而我只使用result 部分($0) 进行缩减,Xcode 无法推断出我试图缩减到的类型。

    将代码更改为此解决了问题:

    let totalValue: CGFloat = totalValue ?? newSlices.map({ $0.value }).reduce(0.0, { $0 + $1 })
    

    由于$1CGFloat,Xcode 可以推断出结果也是CGFloat

    【讨论】:

    • .reduce(0, +) Btw Swift 是一种类型推断语言,一般不需要显式设置类型let totalValue = totalValue ?? newSlices.map{$0.value}.reduce(0,+)
    • 另外,您可能希望避免额外传递 newSlices 并直接计算 reducelet totalValue = totalValue ?? newSlices.reduce(0.0) { $0 + $1.value } 的值之和。
    • 感谢您的反馈。两者都是比当前实现更好的建议。
    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多