UICollectionViewDiffableDataSource 闭包中的参数来自哪里?

问题描述

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

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

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

我对闭包参数的困惑在于它们的来源:

  • 他碰巧在视图控制器的其他地方将 collectionView 声明为全局变量。所以我想这是传入的必要条件?
  • indexPath 从哪里来?
  • 最令人困惑的是:它怎么知道 app 是什么?据我所知,它没有在任何地方声明。我看过的所有教程都是这种情况。 App 实例的概念究竟来自哪里?

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

解决方法

这是对象的初始值设定项。它看起来像这样:

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

它正在使用泛型,这些泛型是这样提供的

本例中的部分定义为:

 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