struct Car1<T : RawRepresentable, CaseIterable, Hashable> where T.RawValue == String
… is declaring three generic parameter placeholders : the first T has to implement RawRepresentable, the second is a new placeholder called CaseIterable and the third is also a new placeholder called Hashable. Because of the commas, these last two do not represent existing types, they are new types with a scope restricted to the generic type.
As @linqingmo says, you might as well have used struct Car1<T: RawRepresentable, A, B>
If you really wanted to declare a generic struct whose generic parameter implemented those three protocols, and you already have a protocol that combines them, then why not simply write :