Y a-t-il une différence de valeur littérale et une valeur littérale entière entière lors de la déclaration d'une variable? P>
4 Réponses :
let a = 5 print(a) // 5 print(type(of: a)) // Int let b = Int(5) print(b) // 5 print(type(of: b)) // Int You simply use the Int class constructor. In your second way it's implicit. Pick your first option.
Les deux sont le même type d'objet Int?
@John Oui, c'est le but de type (de :) la fonction imprimée dans l'exemple.
var a = 5
SWIFT utilise le type d'inférence et de littéraux entier des types SWIFT est déduit le type int code>, de sorte que le type de a code> in let a = 5 code> sera < Code> int code>. Par conséquent, passer un littéral entier à l'initialiseur de int code> n'a aucun autre effet, de sorte que vos deux exemples atteignent les mêmes résultats. P>
Avant d'optimisation, oui, celles-ci sont différentes. var a = 5 code> est immédiatement optimisé pour donner des références futures à A code> la valeur de 5. var a = int (5) code> inclut un appel de la fonction à SIGNINEINTEGER.INIT CODE>. Vous pouvez voir cela en émettant la SIL: // main
sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 {
bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>):
alloc_global @$S4main1xSivp // id: %2
%3 = global_addr @$S4main1xSivp : $*Int // user: %6
%4 = integer_literal $Builtin.Int64, 5 // user: %5
%5 = struct $Int (%4 : $Builtin.Int64) // user: %6
store %5 to %3 : $*Int // id: %6
%7 = integer_literal $Builtin.Int32, 0 // user: %8
%8 = struct $Int32 (%7 : $Builtin.Int32) // user: %9
return %8 : $Int32 // id: %9
} // end sil function 'main'