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

Segue传递UUID后Realm查询WorkoutSessionObject崩溃求助

解决Realm查询崩溃问题

我来帮你排查这个崩溃问题,核心原因是Realm查询谓词的格式占位符用错了,咱们一步步解决:

1. 修正谓词的格式符

你当前用的%A是用于打印对象调试描述的占位符,而workoutID是字符串类型,应该用%@(这是Objective-C/Swift中用于对象类型的标准占位符,包括字符串)。

修正后的谓词代码:

let predicate = NSPredicate(format: "workoutID = %@", workoutID)

这就是崩溃提示里“期望string但收到0”的根源——%A错误地把字符串解析成了其他类型,导致查询匹配失败。

2. 确认Realm模型的属性类型

请检查你的WorkoutSessionObject模型,确保workoutID属性是String类型,和你传递的uuidString完全匹配:

class WorkoutSessionObject: Object {
    @Persisted var workoutID: String // 必须是String类型,不能是UUID
    // 其他属性定义...
}

如果模型里定义的是UUID类型,那你需要把传递的字符串转成UUID再查询,但根据崩溃提示,大概率是模型是String但谓词用错了格式符。

3. 替换try!为安全的错误处理

try!会在Realm操作出错时直接崩溃,建议改用do-catch捕获错误,方便排查潜在问题:

do {
    let realm = try Realm()
    let matchingSessions = realm.objects(WorkoutSessionObject.self).filter(predicate)
    print("查询到的会话:\(matchingSessions)")
} catch {
    print("Realm查询出错:\(error.localizedDescription)")
}

4. 优化workoutID的传递检查

虽然你说打印正常,但可以优化变量定义,避免使用默认值导致的潜在问题:

// 改成隐式可选,确保Segue必须赋值,否则会在赋值阶段崩溃(比查询时崩溃更容易定位)
var workoutID: String! 

override func viewDidLoad() {
    super.viewDidLoad() // 建议先调用super方法,符合UIViewController生命周期规范
    
    guard let validWorkoutID = workoutID else {
        print("错误:workoutID未通过Segue传递")
        return
    }
    print("传递的workoutID:\(validWorkoutID)")
    
    // 后续查询代码...
}

按照上面的步骤修改后,你的查询应该就能正常运行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:01:02