31923


リテラルと型について勉強中です。

ExpressibleByFloatLiteralの次の付属型は、既定型としてDouble型となっているそうですが、  
ソースでは、

associatedtype FloatLiteralType : _ExpressibleByBuiltinFloatLiteral

と記述されているようです。※GitHubに上がっているソースから参照しただけですが。。。

associatedtype FloatLiteralType : _ExpressibleByBuiltinFloatLiteral = Double

と記述されているなら理解できますが、なぜデフォルトが、Double型となるのでしょうか。

またAppleリファレンスで、「FloatLiteralType」で検索したところ、「typealias FloatLiteralType =
Double」と記述されていましたが、どこでこれらの宣言がおこなわれているのでしょうか。教えてください。


CC BY-SA 3.0
2017-01-16T09:35:01.537
31887
2017-01-17T19:21:30.250
11148
question
swift swift3
ExpressibleByFloatLiteralの付属型のデフォルト


規定というか、

[code]

    struct S : ExpressibleByFloatLiteral {
      init(floatLiteral: FloatLiteralType) {}
    }
    
[/code]

と書いた場合に、なぜ `S.FloatLiteralType` が `Double` になるかっていう事ですよね？

上記ソースで `FloatLiteralType` は `S.FloatLiteralType` を参照しているのではなくて、グローバルの
`Swift.FloatLiteralType` つまり `typealias FloatLiteralType = Double`
を参照している状態です。(Xcodeで command + クリックしてみると分かります。)

で、プロトコルの制約から `associatedtype FloatLiteralType` が類推されて `S.FloatLiteralType` が
`Double` になります。

自前で書くとしたらこんな感じです。

[code]

    typealias AssocTy = Int
    
    protocol P {
      associatedtype AssocTy
      func foo(x: AssocTy)
    }
    
    class C : P {
      func foo(x: AssocTy) {}
    }
    
    C.AssocTy.self == Int.self // true 
    
[/code]


CC BY-SA 3.0
2017-01-17T19:11:49.240
31923
2017-01-17T19:21:30.250
2017-01-17T19:21:30.250
3489
3489
31887
answer