KMM项目中Swift端无法将MutableList映射为字符串数组的问题排查
Hey there! Let's break down why you're hitting that error and get your code working smoothly.
The Root Cause
That error Value of type 'NSArray.Element' (aka 'Any') has no member 'name' boils down to how KMM maps Kotlin collections to iOS types. When you use a MutableList<Employee> in Kotlin, KMM exposes it to Swift as an NSMutableArray (or NSArray). Swift can't automatically infer that every element in this array is an Employee, so it treats each item as a generic Any type— which doesn't have a name property, hence the error.
Solution 1: Use Kotlin List Instead of MutableList (Recommended)
The cleanest fix is to adjust your Kotlin model to use an immutable List for the employees property. KMM maps Kotlin's List directly to a strongly typed Swift array [Employee], which lets Swift correctly recognize the element type without extra work.
Update your Kotlin Work data class:
data class Work( //kotlin val id: String, val name: String, val employees: List<Employee>, // Switch to immutable List val todoToday: Boolean )
With this change, your original Swift code will work exactly as you wrote it—no more errors, because work.employees is now recognized as an array of Employee objects.
Solution 2: Explicitly Cast Elements in Swift
If you need to keep the MutableList in Kotlin (for example, if you need to modify the array later), you can explicitly cast each element to Employee in your Swift code. Add a safe cast to avoid crashes if the array ever contains unexpected elements:
Modify your Swift Text block like this:
Text( (work.employees as? [Employee])?.map { $0.name } .joined(separator: ", ") ?? "No employees listed" )
Here, as? [Employee] safely converts the NSArray to a strongly typed Swift array. The optional chain (?.) ensures we only proceed if the cast succeeds, and the ?? provides a friendly fallback string in case something goes wrong.
Quick Note on Mutability
If you do keep the MutableList in Kotlin, remember that in Swift you'll need to cast it to NSMutableArray if you want to modify the array contents. For read-only operations like mapping to names, the safe cast to [Employee] works perfectly.
内容的提问来源于stack exchange,提问作者barryalan2633

