簡體   English   中英

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

[英]What the meaning of StructName.init of Swift language?

我在看iOS,MVVM示例項目,不知道是什么語法

這段代碼的ArticleViewModel.init是什么?

self.articlesVM = articles.compactMap(ArticleViewModel.init)

ArticleViewModel 需要一個參數來初始化。

StructName.init 是什么意思? 我無法谷歌,如果你知道請幫忙。

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
    }

}

當您將.init作為閉包傳遞時,這只是將閉包參數傳​​遞給 init 的簡寫。

所以articles.compactMap(ArticleViewModel.init)articles.compactMap { ArticleViewModel.init($0) }簡寫(你不會真正寫出.init ,而是使用簡寫符號ArticleViewModel($0) )。

關鍵是看一下 compactMap 正在采用什么參數:

public func compactMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

正如 Apple 的文檔所說, “transform - 是一個閉包,它接受這個序列的一個元素作為它的參數並返回一個可選值。”

ArticleViewModel.init也是一個將文章參數作為輸入的閉包:

init(_ article: Article) {
        self.article = article
    }

這就是為什么您可以將此閉包的引用作為參數傳遞給compactMap

articles.compactMap(ArticleViewModel.init)

compactMap調用將循環遍歷articles數組的每個元素,並自動將每個單獨的元素作為參數傳遞給提供的ArticleViewModel.init閉包。 這個閉包將從它接收到的每個Article對象創建一個ArticleViewModel實例,如果創建的ArticleViewModel對象不為 nil,則將它放入/添加到self.articlesVM數組中。

通過使用執行相同結果的更明確的代碼可以實現完全相同的事情:

self.articlesVM = articles.compactMap { article in
            ArticleViewModel(article)
        }

PS由於ArticleViewModel初始化ArticleViewModel總是返回 object 並且不能返回nil ,所以在這里使用compactMap沒有意義。 您可以改用常規map

self.articlesVM = articles.map { article in
            ArticleViewModel(article)
        }

或更短

self.articlesVM = articles.map { ArticleViewModel($0) }

甚至更短

self.articlesVM = articles.map(ArticleViewModel.init)

compactMap需要一個接受Article並返回某些內容的函數。

init(_ article: Article) { self.article = article }獲取一篇Article並返回一些東西

所以你可以在那里使用它( ArticleViewModel.init )。

如此強大,如此簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM