[英]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.