Swift中StructName.init的含义?iOS MVVM项目代码语法疑问
StructName.init in Your Swift MVVM Code Great question! Let's break down exactly what ArticleViewModel.init does in your code, and why this Swift syntax works so smoothly.
First, a quick recap of compactMap: this method takes a transformation logic for each element in a collection, filters out any nil results from that transformation, and returns a cleaned-up array of non-nil values.
What is ArticleViewModel.init?
In Swift, initializers (the init methods) are treated as first-class functions. Your ArticleViewModel has an initializer with the signature:
init(_ article: Article) -> ArticleViewModel
When you write ArticleViewModel.init, you're referencing this initializer as a function value instead of calling it directly with parentheses. It's a shorthand way to pass the initialization logic around like any other function.
Why does this work with compactMap?
The compactMap method expects a function that takes an Article (the element type of your articles array) and returns an optional value (ArticleViewModel?).
Since your initializer returns a non-optional ArticleViewModel, Swift automatically wraps it in an optional (ArticleViewModel?) to match what compactMap expects. This means:
articles.compactMap(ArticleViewModel.init)
is 100% equivalent to writing the more verbose closure version:
articles.compactMap { article in ArticleViewModel(article) }
It's just cleaner, more concise syntax that leverages Swift's ability to treat initializers as reusable function references.
A quick note about failable initializers
If your ArticleViewModel had a failable initializer (like init?(article: Article) that returns nil if initialization fails), compactMap would automatically filter out any nil results from that initializer—this is actually where compactMap gets its name, as it "compacts" the array by removing invalid entries.
To recap with your code
In your ArticleListViewModel initializer:
self.articlesVM = articles.compactMap(ArticleViewModel.init)
You're telling Swift:
- Take each
Articlein thearticlesarray - Use the
ArticleViewModel.init(_:)initializer to convert it to anArticleViewModel - Since all initializations succeed (your init isn't failable),
compactMapjust returns an array of all thoseArticleViewModelinstances
内容的提问来源于stack exchange,提问作者YOSUKE

