protocol WordResponseTrait {}

// enumは、NameSpace回避のため使っています。
enum GameThemeTrait {
    enum BigWordTrait: WordResponseTrait {}
    enum GeneralWordTrait: WordResponseTrait {}
}

typealias GameTheme = (big: BigWord, general: GeneralWord)

typealias BigWord = WordResponse<GameThemeTrait.BigWordTrait>
typealias GeneralWord = WordResponse<GameThemeTrait.GeneralWordTrait>

struct WordResponse<T: WordResponseTrait>: Decodable {
    let ID: String    

   init(key: String) {
        ID = key
    }
}

振る舞いは、似てるが概念としては違い、型レベルで扱いを分けたい時に使用する。

今回のケースでは、BigWordとGeneralWordが振る舞いが同じで概念としては違うという意味合いの元使用している。