Swift语言的StructName.init是什么意思?

时间:2019-12-19 10:44:38

标签: ios swift mvvm

我正在阅读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
    }

}

3 个答案:

答案 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)。

如此强大,如此简单。