I have two identical methods that differ in the argument they receive. One receives an Array<Entity>
and the other one a FetchedResults<Entity>
object, where Entity
is a CoreData Entity. It would be nice to simplify code by removing the duplication and only having one method.
static func groupByDate(_ result : FetchedResults<Entity>)-> [[Entity]]{
return Dictionary(grouping: result){ $0.dateDescription }
.values
.map{$0}
.sorted(by: { $0.first!.timestamp! > $1.first!.timestamp! })
}
static func groupByDate(_ result : [Entity])-> [[Entity]]{
return Dictionary(grouping: result){ $0.dateDescription }
.values
.map{$0}
.sorted(by: { $0.first!.timestamp! > $1.first!.timestamp! })
}
I tried to use a sequence of the Entity type to abstract the method because both Array<Entity>
and FetchedRusults<Entity>
adhere to the protocol. Unfortunately, I wasn't able to get it to work.
I'm curious how you would solve it.
CodePudding user response:
Both FetchedResults
and Array
conform to the Sequence
protocol so you can use that as a generic type and have a where
condition to only allow Sequence
types that has Entity
as it content
static func groupByDate<Values: Sequence>(_ result: Values) -> [[Entity]] where Values.Element == Entity {
return Dictionary(grouping: result, by: { $0.dateDescription })
.values
.sorted(by: { $0.first!.timestamp! > $1.first!.timestamp! })
}