Swift转Kotlin:循环内过滤统计列表元素遇空列表问题
问题:Swift属性监听逻辑迁移到Kotlin后返回空列表/数组
从Swift转用Kotlin,尝试迁移属性监听中循环过滤统计列表元素的功能,代码无报错但返回空列表/数组。
Swift 实现代码
private var issues: [PathPmCore.Issue] = [] { didSet { AppState.shared.issues = issues taskModels.removeAll() var models = [ListModel]() var components = [Double]() for status in TaskState.allCases { let count = issues.filter({ issue in status.ids.contains(where: { statusId in statusId == issue.status.currentStatus.id }) }).count models.append(.init(activeTasks: .constant(count), circleState: .constant(status))) components.append(Double(count)) } DispatchQueue.main.async { self.taskModels = models self.chartComponents = components } } }
错误的 Kotlin 实现代码
private var issues: List<Issues> = emptyList() set(value: List<Issues>){ for (status in TaskState.values()) { val models: ArrayList<ListModel> = arrayListOf<ListModel>() val components = listOf<Double>() val count = issues.filterNotNull().forEach { issue -> status.ids.find { statusId -> statusId == issue.status.currentStatus.id } } println(count) value.count() } }
问题分析
- 集合初始化位置错误:每次循环
TaskState.values()时都重新创建空的models和components,循环结束后没有保留任何数据。 - 统计逻辑错误:
forEach没有返回值,返回的是Unit,无法获取统计数量;应该用filter+size或者直接count函数来匹配条件计数。 - 未更新 backing field:Kotlin setter中必须手动赋值
field = value,否则原issues变量不会更新,始终是空列表。 - 使用旧值而非新值:统计时用了
issues(旧值),而不是传入的value(新赋值的列表)。 - 缺少主线程更新:对应Swift的
DispatchQueue.main.async,Kotlin中更新UI需要切换到主线程。
修正后的 Kotlin 代码
private var issues: List<Issues> = emptyList() set(value) { // 更新backing field field = value // 同步更新全局状态 AppState.shared.issues = value val models = arrayListOf<ListModel>() val components = arrayListOf<Double>() for (status in TaskState.values()) { // 统计符合条件的issue数量 val count = value.filterNotNull().count { issue -> status.ids.contains(issue.status.currentStatus.id) } models.add(ListModel(activeTasks = count, circleState = status)) // 根据实际构造函数调整,若需状态包装可替换为mutableStateOf(count) components.add(count.toDouble()) } // 主线程更新UI,根据项目环境选择方式,比如Activity的runOnUiThread或Coroutine的Dispatchers.Main runOnUiThread { taskModels = models chartComponents = components } }
内容的提问来源于stack exchange,提问作者saxonsxexe
相关产品推荐
相关产品推荐

