As the resident ex-Scala person I guess I should chime in here 
Let's slightly adjust the snippet we're talking about because implicits must be opt in for the values. It's not like any arbitrary value of the type is picked up for an implicit parameter, only implicit ones are.
implicit let assistant = ZhuLi(season: 4) // implicit is necessary
let viewModel = ViewModel()
viewModel.doTheThing()//(assistant: assistant)
// func doTheThing()(implicit Assistant)
And yes they're one of the best things in Scala tbh. They're excellent for passing execution contexts around, and they're type-safe -- I know I MUST be provided a value of assistant in order to compile.
The same doesn't hold true with task-local values which are "it may be there, or not".
So yeah, I do think implicit parameters are really great and weirdly enough they'd help us with task executors where we could have the implicit Executor to Task decide where a task should execute.
This would then automatically work for Task()(implicit Executor) rather than the specialized compiled feature of @_inheritActorContext, but I'm unsure how the core team feel about such extension to the language.
So the typical use case in Scala (and literarily taken from Akka tbh, this is how actor context and stream materializer work):
protocol Actor {
implicit var executor: ... { get }
}
extension Task {
init(...)(implicit Executor) { ... }
}
would allow for:
actor Kappa {
func test() {
Task()//(self.executor)
{ /* runs on actor's executor */ }
}
}
Now the problem with that is, if it were to exist, it doesn't integrate with nonisolated. Because Swift leans in heavily into concurrency as part of the type system we do actually a bit more than implicit parameters for execution context would allow. So it's not all roses here, but it's definitely a nice tool that would be nice to have.
Other common uses include "tolerance" for comparing floating point values, or "timeout value" in a context that defaults to a value from scope or can be overriden:
implicit let timeout = Duration.seconds(1)
expectMessage() // timeout
expectMessage()(timeout + .seconds(2))
or an implicit file system for mocking it out easily etc. etc.
Parameters themselfes are a very clean solution in my mind, and get un-necessarily bad rep from outside of the Scala community (it is implicit conversions that are the work of the devil).