这段代码中 .enumerated() 和 .map() 的用途是什么?

What is the purpose of .enumerated() and .map() in this code?

我正在学习 https://www.raywenderlich.com/921-cocoa-bindings-on-macos 的教程。我想知道 .enumerated() 和 .map() 函数在本节中的作用是什么:

@IBAction func searchClicked(_ sender: Any) {

  guard let resultsNumber = Int(numberResultsComboBox.stringValue)
    else {
      return
  }
  iTunesRequestManager.getSearchResults(searchTextField.stringValue, results: resultsNumber, langString: "en_us") { (results, error) in
    let itunesResults = results.map {
      return Result(dictionary: [=10=])
    }

      .enumerated()
      .map({ (index, element) -> Result in
        element.rank = index + 1
        return element
      })

    DispatchQueue.main.async {
      self.searchResultsController.content = itunesResults
      print(self.searchResultsController.content!)
    }
  }

}

我通常最终可以在 Swift 中弄清楚大部分事情,但我在这里被难住了,解释性文字对我来说也不清楚。我希望有人能帮助我理解教程的这一部分。谢谢!

  1. 地图用于修改。此时,您基本上是通过将 results 数组作为参数来初始化 Result 的对象:
results.map {
   return Result(dictionary: [=10=])
}

[=16=]表示第一个输入。在下面的例子中,[=16=] 等于 param(我们只是给它起了个名字):

results.map { param in
   return Result(dictionary: param)
}
  1. .enumerated() returns 数组的每个元素及其索引号。没有它,您将只有这样的元素:
 .map({ (element) -> Result in
        // you don't have `index` value inside the closure anymore
        // element.rank = index + 1
        return element
 })

请注意,上面闭包中的 element 与您在之前的 map 函数中创建的 Result(dictionary: [=21=]) 对象相同。

  1. 最后,您通过将元素索引号增加 1 分配给元素的 rank 属性 并返回它来进行修改:
 .map({ (index, element) -> Result in
        // element.rank = index + 1
        return element
 })

注意我们在第3步之后得到的值,包括所有的修改都赋给了let itunesResults