使用reduce()时将String转换为Int

时间:2018-03-25 16:11:40

标签: swift type-conversion reduce

我有代码:

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

2 个答案:

答案 0 :(得分:2)

reduce第二个参数是结果,$0是结果,$1是字符串。而不是强行打开可选的默认值会更好。

let number: String = "111 15 111"
let result = number.components(separatedBy: " ").reduce(0, {$0 + (Int($1) ?? 0) })

另一个替代方案是使用flatMapreduce以及+运算符。

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)! })