无法使用“(String, (String) -> String)”类型的参数列表调用 'reduce'

Cannot invoke 'reduce' with an argument list of type '(String, (String) -> String)'

我正在尝试将 Swift 3 转换为 Swift 4 以获得 github 上的 repo。这是一个阻止我的功能。

func times(_ n: Int) -> String {
    return (0..<n).reduce("") { [=11=] + self } 
}

Xcode给出的错误是:

"Cannot invoke 'reduce' with an argument list of type '(String, (String) -> String)'"

我查看了 Apple 的官方页面,发现 reduce(_:_:) and reduce(into:_:), and someone's 。已经尝试了下面的代码,但我仍然无法让它工作。请指出我遗漏的内容。

return (0..<n).character.reduce("") { string, character in
                (0..<n) + self }

return (0..<n).character.reduce("") { [=12=] + self }

这里的[=15=]指的是闭包的第一个参数(我认为)。然后我们可以 self 属性 在它自己的实例方法中引用当前实例。

答案取决于你要做什么。很难弄清楚 reduce 到底做了什么,但是你必须明白这个函数的要点是需要将数组 reduce 为一个变量。

看例子:

let items = ["one", "two", "three"]
let final = items.reduce("initial") { text, item in "\(text), \(item)" }
print(final) // initial, one, two, three

在闭包中 text 是一个累积字符串。初始值设置为参数。 "initial" 在我们的例子中。在第一次迭代中,文本将是 initial, one。第二个:initial, one, two。等等。那是因为我们设置了一个规则如何减少数组:"\(text), \(item)"


在你的例子中:

func times(_ n: Int) -> String {
    return (0..<n).reduce("") { [=11=] + self } 
}
  1. 首先我们通过这个 (0..<n) 创建一个包含 n 项的数组:[0, 1, 2, 3, 4..]
  2. 然后我们设置一个初始值作为一个空字符串。
  3. 下一个不知道你需要什么

也许您需要一个结果字符串 0123456789..,然后有一个代码:

let reduced = (0..<n).reduce("") { text, value in text + "\(value)" }

希望对你有所帮助=)

您的闭包将接收两个参数,而您只使用一个 ($0)。你可以在闭包中使用 $0.0 或者简单地使用字符串构造函数来做同样的事情而不减少:

func times(_ n: Int) -> String 
{ return String(repeating:self, count:n) }

或者,如果你想像乘法一样使用Python来重复一个字符串,你可以添加一个运算符:

extension String
{
    static func *(lhs:String,rhs:Int) -> String
    { return String(repeating:lhs, count:rhs) }
}

// then, the following will work nicely:

"blah " * 10  // ==> "blah blah blah blah blah blah blah blah blah blah "