使用Int枚举减少Swift 3.0中的高阶函数

时间:2017-07-16 03:56:01

标签: swift swift3

我正在学习与集合相关的Swift高阶函数。我跟reduce

有以下查询
enum Coin : Int {
    case Penny = 1
    case Nickel = 5
    case Dime = 10
    case Quarter = 25
}

let coinArray: [Coin] = [.Dime, .Quarter, .Penny, .Penny, .Nickel, .Nickel]

coinArray.reduce(0,{ (x:Coin, y:Coin) -> Int in
    return x.rawValue + y.rawValue
})

我收到以下错误:

  

声明的闭包结果Int与上下文类型_

不兼容

2 个答案:

答案 0 :(得分:3)

让我们看看如何声明reduce

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

查看nextPartialResult的类型?它是(Result, Element) -> Result。在您的情况下,Result的类型是什么?它是Int,因为您希望将整个事物减少为整数。

因此,传递(Coin, Coin) -> Int在这里确实不起作用,是吗?

您应该传递一个(Int, Coin) -> Int

coinArray.reduce(0,{ (x:Int, y:Coin) -> Int in
    return x + y.rawValue
})

或者简单地说:

coinArray.reduce(0) { $0 + $1.rawValue }

答案 1 :(得分:2)

reduce应用到coinArray后,您将获得以下签名:

enter image description here

问问自己通用结果的类型是什么?它是coin类型还是Int类型? nextPartialResult的类型是什么?是类型coin还是类型Int

答案是:ResultIntnextPartialResult闭包',它带有一个类型为result的参数,其中{{1}另一个类型为Int的参数,最终返回coin'

所以正确的写作方式是:

Int

或者在更有意义的意义上你可以写:

coinArray.reduce(0,{ (x, y) -> Int in
    return x + y.rawValue
})

coinArray.reduce(0,{ (currentResult, coin) -> Int in return currentResult + coin.rawValue }) 也不是一个好名字。只需写下coinArray即可。复数形式比coins / coinArray更具可读性!