我有代码:
let number: String = "111 15 111"
let result = number.components(separatedBy: " ").map {Int($0)!}.reduce(0, {$0 + $1})
首先它需要给定字符串并拆分成数组。接下来,将每个数字转换为整数,最后将所有数字相加。它工作正常,但代码有点长。所以我有了获得map函数的想法,并在使用reduce时将String转换为Int,如下所示:
let result = number.components(separatedBy: " ").reduce(0, {Int($0)! + Int($1)!})
,输出为:
error: cannot invoke 'reduce' with an argument list of type '(Int, (String, String) -> Int)'
因此我的问题是:为什么我在使用reduce()?
时无法将String转换为Integer答案 0 :(得分:2)
reduce
第二个参数是结果,$0
是结果,$1
是字符串。而不是强行打开可选的默认值会更好。
let number: String = "111 15 111"
let result = number.components(separatedBy: " ").reduce(0, {$0 + (Int($1) ?? 0) })
另一个替代方案是使用flatMap
和reduce
以及+
运算符。
let result = number.components(separatedBy: " ").flatMap(Int.init).reduce(0, +)
答案 1 :(得分:2)
你的错误是关闭中的第一个论点。如果你查看reduce
声明,第一个闭包参数是Result
类型,在你的情况下是Int
:
public func reduce<Result>(_ initialResult: Result,
_ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
所以正确的代码是:
let result = number.components(separatedBy: " ").reduce(0, { $0 + Int($1)! })