1

无法理解 中的闭包UICollectionViewDiffableDataSource,尤其是传递给它的内容。我能找到的所有教程都解释了要输入什么而不是为什么,而且我对 Swift 和编程还是有点陌生​​。

我正在关注 Paul Hudson 的教程(他正在制作一个由App对象组成的应用商店),并在其中createDataSource()写道:

dataSource = UICollectionViewDiffableDataSource<Section, App>(collectionView: collectionView)
  { collectionView, indexPath, app in 
    //rest of the closure
  }

我对闭包参数的困惑在于它们来自哪里:

  • 他碰巧collectionView在 View Controller 的其他地方声明为全局变量。所以我想这是传递的必要条件?
  • 来自哪里indexPath
  • 最令人困惑的是:它怎么知道app是什么?据我所知,它没有在任何地方声明。在我看过的所有教程中都是这种情况。世界上的一个实例的概念是App从哪里来的?

非常感谢任何可以帮助我掌握这一点的人,我一直在搜索教程,但很难弄清楚这里的机制。

4

1 回答 1

0

这是对象的初始化程序。它看起来像这样:

  UICollectionViewDiffableDataSource<<#SectionIdentifierType: Hashable#>, <#ItemIdentifierType: Hashable#>>(collectionView: collectionView)

它使用了提供的泛型,例如 <Section, App> 本示例中的部分定义为:

 import Foundation

  struct Section: Decodable, Hashable {
     let id: Int
     let type: String
     let title: String
     let subtitle: String
     let items: [App]
  }

App在本例中的应用程序中定义为:

  import Foundation

  struct App: Decodable, Hashable {
      let id: Int
      let tagline: String
      let name: String
      let subheading: String
      let image: String
      let iap: Bool
  }

这些类型被提供给初始化器以满足泛型 init 的类型要求。

请注意,该对象现在了解如何从 UICollectionView 获取信息。

它现在可以使用参数调用块:

  1. 您提供的集合视图。
  2. 通过按 Section 类型查询各个部分的项的 IndexPath。2a. 通过在 section 中查询类型 App 的集合视图的行信息。
  3. 在 indexPath 处查询 App 实例的 collectionView。

查看通用类型以获得更好的理解。

https://docs.swift.org/swift-book/LanguageGuide/Generics.html

于 2021-06-30T19:15:19.000 回答