質問: Double」と記述されていましたが、どこでこれらの宣言がおこなわれているのでしょうか。教えてください。
回答: 規定というか、 ``` struct S : ExpressibleByFloatLiteral { init(floatLiteral: FloatLiteralType) {} } ``` と書いた場合に、なぜ `S.FloatLiteralType` が `Double` になるかっていう事ですよね? 上記ソースで `FloatLiteralType` は `S.FloatLiteralType` を参照しているのではなくて、グローバルの `Swift.FloatLiteralType` つまり `typealias FloatLiteralType = Double` を参照している状態です。(Xcodeで command + クリックしてみると分かります。) で、プロトコルの制約から `associatedtype FloatLiteralType` が類推されて `S.FloatLiteralType` が `Double` になります。 自前で書くとしたらこんな感じです。 ``` typealias AssocTy = Int protocol P { associatedtype AssocTy func foo(x: AssocTy) } class C : P { func foo(x: AssocTy) {} } C.AssocTy.self == Int.self // true ```