Pourquoi le code suivant est-il possible dans Swift? NSNumber est un type défini dans le module Foundation et n'est pas défini comme type natif dans Swift. Comment le littéral de 35.5
peut-il être interprété comme une valeur de NSNumber?Pourquoi un littéral numérique peut-il être interprété comme un NSNumber dans Swift?
Répondre
NSNumber
est conforme aux ExpressibleByBooleanLiteral
, ExpressibleByFloatLiteral
et ExpressibleByIntegerLiteral
protocoles, ce qui signifie qu'il peut être initialisé à partir d'un booléen, virgule flottante ou littéral entier:
let n1: NSNumber = false
let n2: NSNumber = 12.34
let n3: NSNumber = 123
Il existe un protocole nommé ExpressibleByIntegerLiteral
. Si votre classe se conforme à ce protocole, elle vous permet de vous initier en utilisant une syntaxe similaire à celle que vous avez montrée. Il existe d'autres protocoles comme par exemple. ExpressibleByStringLiteral
qui fonctionne d'une manière souriante. NSNumber se conforme simplement au protocole ExpressibleByIntegerLiteral
ce qui signifie qu'il implémente init(integerLiteral value: Self.IntegerLiteralType)
qui est utilisé dans ce cas.
NsNunber a une union interne contenant les données. En tant que tel, le type primitif peut simplement être affecté. Voir aussi https://www.mikeash.com/pyblog/friday-qa-2012-07-06-lets-build-nsnumber.html