2016-11-25 4 views
2

Взятые из Ios 10 Основы программирования:Swift ExpressibleByIntegerLiteral - Как именно он работает?

«Потому что гнездо принимает ExpressibleByIntegerLiteral, мы можем пройти Int, где, как ожидается, гнездо, и наш Init (integerLiteral :) будет называться АВТОМАТИЧЕСКИ .....»

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

Итак, мой вопрос в том, что ... Как он называется автоматически, хотя ??? Моя логика проникает в кирпичную стену, когда я пытаюсь понять, почему. Из того, что я вижу, вы можете сказать:

var eggie : Nest = 5 

, но ... хорошо, где есть логика в том, как число 5 после знака равенства на самом деле является сокращением для:

var eggie : Nest = Nest(5) 

ИНАЧЕ " стандартный 'способ инициализации нового экземпляра ...

Это что-то скрытое глубоко внутри протокола ExpressibleByIntegerLiteral, который обрабатывает это преобразование?

Благодаря

+3

* Компилятор * преобразует 'var eggie: Nest = 5' в' var eggie = Nest (integerLiteral: 5) ' –

ответ

3

Это компилятор magic, так что, к сожалению, вы не можете сами объявить такой протокол. :(

Это не имеет ничего общего с внутренней работой ExpressibleByIntegerLiteral. Компилятор видит только переменную типа Nest на левом и целом литерале справа. Он думает,

Oh! Тип Nest соответствует ExpressibleByIntegerLiteral! И я вижу целое буквальным. Это означает, что я могу изменить число литерала Nest(integerLiteral: 5)!

Это так просто, как это. Это верно и для других ExpressibleByXXXLiteral протоколов.

Вы не можете объявить свой собственный протокол ExpressibleByMyClass, потому что компилятор об этом не знает.

1

В ExpressibleBy*Literal протоколы Swift протоколы к «крюк» в специальное поведение компилятора. Без компилятора, делающего подъем в спину, они ничего не смогут сделать.

Смежные вопросы