我正在学习与集合相关的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与上下文类型_
不兼容
答案 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
后,您将获得以下签名:
问问自己通用结果的类型是什么?它是coin
类型还是Int
类型? nextPartialResult
的类型是什么?是类型coin
还是类型Int
?
答案是:Result
是Int
,nextPartialResult
是闭包',它带有一个类型为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
更具可读性!