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

Swift/SwiftUI函数无法读取前序函数设置的更新值

问题分析与修复方案

首先明确核心问题:getLastScore返回nil,说明scores.filter { $0.quizTitle == quizTitle }得到的是空数组——要么是查询时的quizTitle和添加时不匹配,要么是数组未正确更新。结合你确认addScore运行正常的前提,以下是具体修复和排查步骤:

1. 移除多余的手动变更通知

addScore里手动调用的objectWillChange.send()是多余的:@Published修饰的scores数组在被修改(比如append)时,会自动发送变更通知。手动调用反而可能导致通知时机异常,干扰视图更新逻辑。修改后的addScore函数:

func addScore(score: Int, quizTitle: String) {
    let quizScore = QuizScore(date: Date(), score: score, quizTitle: quizTitle)
    scores.append(quizScore)
    saveScores()
    // 删除此行:objectWillChange.send()
}

2. 确保视图正确监听数据变化

在SwiftUI视图中,必须用@StateObject(iOS 14+,用于初始化的实例)或@ObservedObject(用于父视图传递的实例)持有QuizScoreManager,否则视图无法感知scores的更新。示例代码:

struct YourQuizView: View {
    @StateObject private var scoreManager = QuizScoreManager()
    
    var body: some View {
        VStack {
            Button("提交分数") {
                scoreManager.addScore(score: 85, quizTitle: "iOS基础")
            }
            Text("最新分数:\(scoreManager.getLastScore(forQuizTitle: "iOS基础") ?? 0)")
        }
    }
}

3. 校验字符串匹配一致性

filter的字符串匹配是精确匹配,检查调用getLastScore时传入的quizTitle,和调用addScore时的参数是否完全一致(包括大小写、空格、特殊字符)。比如添加时用了"iOS基础",查询时用"ios基础"就会匹配失败。

4. 验证数组数据正确性

调用printScores()函数,查看控制台输出,确认添加的分数已经存在于scores数组中,同时核对quizTitle是否和查询时一致。

内容的提问来源于stack exchange,提问作者Flynn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:45:26