There is a conflict in SwiftData (specifically when synced with CloudKit) when a @Model attribute shares the same name as a case within its assigned enum type. When this occurs, accessing the attribute on a model instance consistently returns the value corresponding to the enum case name, rather than the actual value persisted in the database.
Steps to Reproduce
-
Define an enumeration (e.g.,
Status) with a case that matches a planned property name (e.g., casestatus). -
Create a SwiftData
@Modelthat uses this enum. -
Name the property in the model the same as the enum case.
-
Attempt to save and then retrieve the value.
Example Code
enum TaskStatus: String, Codable {
case status // The conflict source
case pending
case completed
}
@Model
class TodoItem {
// Conflict: Property name matches enum case name
var status: TaskStatus
init(status: TaskStatus) {
self.status = status
}
}
Expected Behavior
The property item.status should return the value stored in the database (e.g., .pending or .completed).
Actual Behavior
The property item.status consistently resolves to the enum case .status, ignoring the actual persisted data.