Skip to content

Commit a5beb76

Browse files
committed
Fixed NSManagedObject.attribute(for:)
1 parent 61329e1 commit a5beb76

1 file changed

Lines changed: 78 additions & 20 deletions

File tree

Sources/CoreDataModel/NSManagedObject.swift

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,33 +25,91 @@ internal extension NSManagedObject {
2525
guard let objectValue = self.value(forKey: key.rawValue)
2626
else { return .null }
2727

28-
if let string = objectValue as? String {
29-
return .string(string)
30-
} else if let uuid = objectValue as? UUID {
31-
return .uuid(uuid)
32-
} else if let url = objectValue as? URL {
33-
return .url(url)
34-
} else if let data = objectValue as? Data {
35-
return .data(data)
36-
} else if let date = objectValue as? Date {
37-
return .date(date)
38-
} else if let value = objectValue as? Bool {
28+
guard let coreDataAttribute = entity.attributesByName[key.rawValue] else {
29+
assertionFailure("Unknown CoreData attribute \(key)")
30+
throw CocoaError(.coreData)
31+
}
32+
33+
guard let attributeType = AttributeType(attributeType: coreDataAttribute.attributeType) else {
34+
assertionFailure("Invalid CoreData attribute \(coreDataAttribute)")
35+
throw CocoaError(.coreData)
36+
}
37+
38+
let value: AttributeValue
39+
40+
switch attributeType {
41+
case .bool:
42+
guard let value = objectValue as? Bool else {
43+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
44+
throw CocoaError(.coreData)
45+
}
3946
return .bool(value)
40-
} else if let value = objectValue as? Int16 {
47+
case .int16:
48+
guard let value = objectValue as? Int16 else {
49+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
50+
throw CocoaError(.coreData)
51+
}
4152
return .int16(value)
42-
} else if let value = objectValue as? Int32 {
53+
case .int32:
54+
guard let value = objectValue as? Int32 else {
55+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
56+
throw CocoaError(.coreData)
57+
}
4358
return .int32(value)
44-
} else if let value = objectValue as? Int64 {
59+
case .int64:
60+
guard let value = objectValue as? Int64 else {
61+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
62+
throw CocoaError(.coreData)
63+
}
4564
return .int64(value)
46-
} else if let value = objectValue as? Float {
65+
case .float:
66+
guard let value = objectValue as? Float else {
67+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
68+
throw CocoaError(.coreData)
69+
}
4770
return .float(value)
48-
} else if let value = objectValue as? Double {
71+
case .double:
72+
guard let value = objectValue as? Double else {
73+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
74+
throw CocoaError(.coreData)
75+
}
4976
return .double(value)
50-
} else if let value = objectValue as? NSDecimalNumber {
77+
case .string:
78+
guard let value = objectValue as? String else {
79+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
80+
throw CocoaError(.coreData)
81+
}
82+
return .string(value)
83+
case .data:
84+
guard let value = objectValue as? Data else {
85+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
86+
throw CocoaError(.coreData)
87+
}
88+
return .data(value)
89+
case .date:
90+
guard let value = objectValue as? Date else {
91+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
92+
throw CocoaError(.coreData)
93+
}
94+
return .date(value)
95+
case .uuid:
96+
guard let value = objectValue as? UUID else {
97+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
98+
throw CocoaError(.coreData)
99+
}
100+
return .uuid(value)
101+
case .url:
102+
guard let value = objectValue as? URL else {
103+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
104+
throw CocoaError(.coreData)
105+
}
106+
return .url(value)
107+
case .decimal:
108+
guard let value = objectValue as? NSDecimalNumber else {
109+
assertionFailure("Invalid CoreData attribute value \(objectValue)")
110+
throw CocoaError(.coreData)
111+
}
51112
return .decimal(value as Decimal)
52-
} else {
53-
assertionFailure("Invalid CoreData attribute value \(objectValue)")
54-
throw CocoaError(.coreData)
55113
}
56114
}
57115

0 commit comments

Comments
 (0)