enum vs protocol をやっていきたいと思います。 protocol A {} class B: A{} class C: A{} vs enum A { case b(B) case c(C) }sealdがないので、protocolを利用した上の例では、予想しないような実装(クラス・構造体)が作られる恐れがあり、またパターンマッチで網羅性を検査することができません。enumがいいのか、という議論になるかというとそうではなくて、(勘違いだったら申し訳ないんですが)Swiftのenumの各タグ(?、たとえば上記の例でいうaとかb)はたしか型パラメーターが取れないです。protocolをつかって次のようにやるしかない、といった感じになるんじゃないでしょうか。 public protocol HList { } public struct HNil: HList { init() { } } public struct HCons<H, T: HList>: HList { public let head: H public let tail: T public init(_ h: H, _ t: T) { self.head = h self.tail = t } }HNilとHConsがありますが、HConsが型パラを取るので、こうしています。