我正在阅读iOS MVVM示例项目, 而且我不知道语法是什么
此代码的 ArticleViewModel.init 是什么?
self.articlesVM = articles.compactMap(ArticleViewModel.init)
ArticleViewModel需要一个参数来初始化。
StructName.init是什么意思? 我无法使用Google,如果您知道,请提供帮助。
struct ArticleListViewModel {
let articlesVM: [ArticleViewModel]
}
extension ArticleListViewModel {
init(_ articles: [Article]) {
self.articlesVM = articles.compactMap(ArticleViewModel.init)
}
}
struct ArticleViewModel {
let article: Article
init(_ article: Article) {
self.article = article
}
}
答案 0 :(得分:1)
当您将.init
作为闭包传递时,这只是将闭包参数传递给init的捷径。
因此articles.compactMap(ArticleViewModel.init)
是articles.compactMap { ArticleViewModel.init($0) }
的简写(您不会真正写出.init
,而是使用简写符号ArticleViewModel($0)
)。
答案 1 :(得分:1)
关键是看一下compactMap所采用的参数:
public func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
如Apple的文档所述,“ transform-是一个闭包,它接受此序列的元素作为其自变量并返回可选值。”
ArticleViewModel.init
也是一个闭包,它使用Article参数作为输入:
init(_ article: Article) {
self.article = article
}
这就是为什么您可以将对此闭包的引用作为compactMap
articles.compactMap(ArticleViewModel.init)
compactMap
调用将循环遍历articles
数组的每个元素,并自动将每个单独的元素作为参数传递给提供的ArticleViewModel.init
闭包。此闭包将从接收到的每个ArticleViewModel
对象创建一个Article
的实例,如果创建的ArticleViewModel
对象不是nil,则将其放置/添加到self.articlesVM
数组中。>
可以使用执行相同结果的更明确的代码来实现完全相同的事情:
self.articlesVM = articles.compactMap { article in
ArticleViewModel(article)
}
P.S。。由于ArticleViewModel
的初始化程序总是返回对象而不能返回nil
,因此在这里使用compactMap
没有意义。您可以改用常规的map
:
self.articlesVM = articles.map { article in
ArticleViewModel(article)
}
或更短
self.articlesVM = articles.map { ArticleViewModel($0) }
或更短
self.articlesVM = articles.map(ArticleViewModel.init)
答案 2 :(得分:1)
compactMap
需要一个函数,该函数需要一个Article
并返回某物。
init(_ article: Article) { self.article = article }
取一个Article
并返回某物
因此您可以在那里使用它(ArticleViewModel.init
)。
如此强大,如此简单。