【问题标题】:What is the purpose of .enumerated() and .map() in this code?这段代码中 .enumerated() 和 .map() 的目的是什么?
【发布时间】:2019-12-26 22:37:39
【问题描述】:

我正在编写来自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: $0)
    }

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

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

}

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

【问题讨论】:

  • 您是否查看过枚举器 aor map 的 API 文档?
  • 是的,我有,但是在显示的文档示例中,正在操作的内容已明确定义(对我而言),例如: for (n, c) in "Swift".enumerated() { print ("(n): '(c)'") and: let cast = ["Vivien", "Marlon", "Kim", "Karl"] let lowercaseNames = cast.map { $0.lowercased() } }
  • cast 只是一个Array<String>(又名[String])。但lowercaseNames 也是如此(调用map 的结果。通过文字(例如cast)生成的值与通过调用函数(例如lowercaseNames)生成的值之间没有区别

标签: swift dictionary enumerate


【解决方案1】:
  1. 地图用于修改。此时,您基本上是通过将results 数组作为参数来初始化Result 的对象:
results.map {
   return Result(dictionary: $0)
}

$0 表示第一个输入。在以下情况下,$0 等于 param(我们只是给了它一个名称):

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

请注意,上述闭包中的 element 与您在之前的 map 函数中创建的 Result(dictionary: $0) 对象相同。

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

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

【讨论】:

  • 谢谢。这很复杂,但您帮助我更好地理解了它。
  • 很高兴听到这个消息!如果对您有帮助,请将其标记为答案:) @JamesH
  • 我做到了。我在这里有点新手,所以我很感激你周到的回答。不理解我的问题的反对意见,尽管没有一些关于我可以做些什么不同的线索。来这里之前我做了很多研究
  • 另外,我刚刚在游乐场中对两个字符串数组进行了类似的调用序列。显然 .enumerated() 和 .map() 在最后声明的数组上工作,所以在本教程中,他们操作的数组(字典)是 itunesResults。很多 Swift 的行为都是从上下文中暗示出来的,所以我必须解决这个问题。再次感谢,现在一切都清楚多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
相关资源
最近更新 更多