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
相关产品推荐
相关产品推荐

