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

