2016-11-25 4 views
2

Swift ExpressibleByIntegerLiteral - 正確にはどのように機能しますか?イオス10プログラミングの基礎から撮影

「巣はExpressibleByIntegerLiteralを採用しているので、私たちは:)巣が期待されているのInt、そして私たちのinit(integerLiteralを渡すことができます.....自動的に呼び出されます」

struct Nest : ExpressibleByIntegerLiteral { 
    var eggCount : Int = 0 
    init() {} 
    init(integerLiteral val: Int) { 
      self.eggCount = val 
    } 
} 

私の質問はこれです...どのように自動的に呼び出されるのですか?理由を理解しようとすると、私の論理はレンガの壁に流れ込んでいきます。大丈夫どこ等号の後の番号5は、簡略のために、実際にはどのようにあるロジックです...

var eggie : Nest = 5 

をしかし:私が見たものから、あなたが言うことができ

var eggie : Nest = Nest(5) 

AKA "新しいインスタンスを初期化する標準的な方法です...

これは、その変換を処理しているExpressibleByIntegerLiteralプロトコルの中に隠されているだけですか?

おかげ

+3

*コンパイラは 'var eggie:Nest = 5'を' var eggie = Nest(integerLiteral:5) 'に変換します。 –

答えて

3

これはコンパイラマジックです。残念ながら、あなたはこのようなプロトコルを自分で宣言することはできません。 :(

それはExpressibleByIntegerLiteralの内部の仕組みとは何の関係もありません。コンパイラは、唯一の左と右の整数リテラルにタイプNestの変数を見ている。それは考えて、

ああ! NestタイプがExpressibleByIntegerLiteralに準拠!そして、私は整数リテラル参照してください。これは私がNest(integerLiteral: 5)に、整数リテラルを変更できることを意味します!

それはそれと同じくらい簡単です。これは、他のExpressibleByXXXLiteralのプロトコルについても同様です。

ExpressibleByMyClassプロトコルを宣言することはできません。なぜなら、コンパイラはそのことを知らないからです。

1

ExpressibleBy*Literalプロトコルは、特別なコンパイラの動作への「フック」にスウィフトプロトコルです。コンパイラが背中を持ち上げることなく、何もすることはできません。

関連する問題