@@ -15,7 +15,7 @@ import Foundation
1515
1616public extension ModelData {
1717
18- func decode< T, K> ( _ type: T . Type , forKey key: K ) throws -> T where T: AttributeDecodable , K: CodingKey {
18+ func decode< T, K> ( _ type: T . Type , forKey key: K ) throws ( ModelDataDecodingError ) -> T where T: AttributeDecodable , K: CodingKey {
1919
2020 let property = PropertyKey ( key)
2121 guard let attribute = self . attributes [ property] else {
@@ -32,7 +32,7 @@ public extension ModelData {
3232 return decodable
3333 }
3434
35- func decodeRelationship< T, K> ( _ type: T . Type , forKey key: K ) throws -> T where T: ObjectIDConvertible , K: CodingKey {
35+ func decodeRelationship< T, K> ( _ type: T . Type , forKey key: K ) throws ( ModelDataDecodingError ) -> T where T: ObjectIDConvertible , K: CodingKey {
3636
3737 let property = PropertyKey ( key)
3838 guard let relationship = self . relationships [ property] else {
@@ -51,7 +51,7 @@ public extension ModelData {
5151 }
5252 }
5353
54- func decodeRelationship< T, K> ( _ type: T ? . Type, forKey key: K ) throws -> T ? where T: ObjectIDConvertible , K: CodingKey {
54+ func decodeRelationship< T, K> ( _ type: T ? . Type, forKey key: K ) throws ( ModelDataDecodingError ) -> T ? where T: ObjectIDConvertible , K: CodingKey {
5555
5656 let property = PropertyKey ( key)
5757 guard let relationship = self . relationships [ property] else {
@@ -70,7 +70,7 @@ public extension ModelData {
7070 }
7171 }
7272
73- func decodeRelationship< T, K> ( _ type: [ T ] . Type, forKey key: K ) throws -> [ T ] where T: ObjectIDConvertible , K: CodingKey {
73+ func decodeRelationship< T, K> ( _ type: [ T ] . Type, forKey key: K ) throws ( ModelDataDecodingError ) -> [ T ] where T: ObjectIDConvertible , K: CodingKey {
7474
7575 let property = PropertyKey ( key)
7676 guard let relationship = self . relationships [ property] else {
@@ -82,12 +82,19 @@ public extension ModelData {
8282 case . toOne:
8383 throw coreModelTypeMismatchError ( type, forKey: key, from: relationship)
8484 case let . toMany( objectIDs) :
85- return try objectIDs. map {
86- guard let id = T . init ( objectID: $0) else {
87- throw coreModelInvalidIdentifierError ( $0)
85+ // - Note: An explicit loop rather than `objectIDs.map`, because the
86+ // `rethrows` closure overload erases the thrown error back to
87+ // `any Error`, which cannot convert to the typed `throws` clause
88+ // under Embedded Swift.
89+ var ids = [ T] ( )
90+ ids. reserveCapacity ( objectIDs. count)
91+ for objectID in objectIDs {
92+ guard let id = T . init ( objectID: objectID) else {
93+ throw coreModelInvalidIdentifierError ( objectID)
8894 }
89- return id
95+ ids . append ( id )
9096 }
97+ return ids
9198 }
9299 }
93100}
0 commit comments