问题描述
无法理解 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 获取信息。
现在可以调用带参数的块了:
- 您提供的集合视图。
- 通过类型 Section 查询部分的项目的 IndexPath。 2a.通过在 section 中查询类型 App 的集合视图获得的行信息。
- 在 indexPath 处查询 App 实例的 collectionView。
查看泛型类型以获得更好的理解。
https://docs.swift.org/swift-book/LanguageGuide/Generics.html