You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
        }
    }

问题分析

  1. 集合初始化位置错误:每次循环TaskState.values()时都重新创建空的models和components,循环结束后没有保留任何数据。
  2. 统计逻辑错误:forEach没有返回值,返回的是Unit,无法获取统计数量;应该用filter+size或者直接count函数来匹配条件计数。
  3. 未更新 backing field:Kotlin setter中必须手动赋值field = value,否则原issues变量不会更新,始终是空列表。
  4. 使用旧值而非新值:统计时用了issues(旧值),而不是传入的value(新赋值的列表)。
  5. 缺少主线程更新:对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:40:44