常量、变量
声明变量和常量
常量和变量必须在使用前声明。 您使用let关键字声明常量,使用var关键字声明变量。 下面是一个例子,说明如何使用常量和变量来跟踪用户进行的登录尝试次数:
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
这段代码可以读作
声明一个常量叫做‘’maximumNumberOfLoginAttempts‘’并且给他赋值为10,声明一个变量叫做‘’currentLoginAttempt‘’,并且给他赋值为0
在此示例中,允许的登录尝试的最大数量被声明为常量,因为最大值从不更改。 当前登录尝试计数器被声明为一个变量,因为该值必须在每次失败的登录尝试之后递增。
您可以在一行上声明多个常量或多个变量,用逗号分隔:
var x = 0.0, y = 0.0, z = 0.0
注意:如果你的代码中的存储值不会改变,总是使用let关键字声明为一个常量。 仅使用变量来存储需要更改的值。
类型注释
您可以在声明常量或变量时提供类型注释,以明确常量或变量可以存储的值的类型。 通过在常量或变量名称后面放置冒号,后跟空格,然后使用要使用的类型的名称来编写类型注释。
下面这个示例为名为welcome Message的变量提供类型注释,以指示变量可以存储字符串值:
var welcomeMessage: String
声明中的冒号表示“... of type ...”,因此上面的代码可以解释为:
“声明一个名为welcome Message的变量,类型为String。"
短语“of type String”表示“可以存储任何字符串值”。它被认为是可以存储的“事物的类型”(或“事物的种类”)。
现在可以将welcomeMessage变量设置为任何字符串值,而不会出错:
welcomeMessage = "Hello"
您可以在单个行上定义多个相同类型的相关变量,用逗号分隔,最后一个变量名后面带有一个类型注释:
var red, green, blue: Double
在实践中很少需要编写类型注释。 如果在定义的点提供常量或变量的初始值,Swift几乎总是可以推断用于该常量或变量的类型,如类型安全和类型推断中所述。 在上面的welcomeMessage示例中,不提供初始值,因此,welcomeMessage变量的类型使用类型注释指定,而不是从初始值推断。
常量和变量的命名
常量和变量名可以包含几乎任何字符,包括Unicode字符:
let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"
常量和变量名称不能包含空格字符,数学符号,箭头,私有使用(或无效)Unicode代码点,或行和框图字符。 他们也不能从一个数字开头,虽然数字可能包括在名称的其他地方。
一旦你声明了某个类型的常量或变量,你不能使用相同的名字重新声明它,或者改变它来存储不同类型的值。 也不能将常数更改为变量或将变量更改为常量。
注意:如果你需要给一个常量或变量与一个保留的Swift关键字相同的名称,当使用它作为名称时,用反引号(`)包围关键字。 但是,避免使用关键字作为名称,除非你没有别的选择。
let `func` = "string"
print(`func`)
注意:与许多其他语言不同,Swift不需要你在代码中的每个语句之后写一个分号(;),如果你愿意,你可以这样做。 但是,如果要在单个行上编写多个单独的语句,则需要使用分号:
let cat = "🐱"; print(cat)
整数
整数是没有小数分量的整数,例如42和-23。 整数有符号(正,零或负)或无符号(正或零)。
Swift提供了8,16,32和64位形式的有符号和无符号整数。 这些整数遵循类似于C的命名约定,其中8位无符号整数的类型为UInt8,而32位有符号整数的类型为Int32。 像Swift中的所有类型一样,这些整数类型具有大写的名称。
整数边界
您可以使用其最小和最大属性访问每个整数类型的最小值和最大值:
let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8
let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
这些属性的值是适当大小的数字类型(例如上例中的UInt8),因此可以在表达式中与其他相同类型的值一起使用。
Int
在大多数情况下,您不需要选择要在代码中使用的特定大小的整数。 Swift提供了一个额外的整数类型Int,它与当前平台的本地词大小相同:
- 在32位平台上,Int与Int32的大小相同。
- 在64位平台上,Int与Int64的大小相同。
除非需要使用特定大小的整数,否则在代码中始终使用Int作为整数值。 这有助于代码一致性和互操作性。 即使在32位平台上,Int也可以存储-2,147,483,648和2,147,483,647之间的任何值,并且对于许多整数范围都足够大。
UInt
Swift还提供了一个无符号整数类型UInt,它与当前平台本地词大小相同:
- 在32位平台上,UInt的大小与UInt32相同。
- 在64位平台上,UInt的大小与UInt64相同。
只有在你需要与平台的本地词大小相同的无符号整数类型时才使用UInt。 如果不是这种情况,则优选Int,即使已知要存储的值是非负的。 对Int整数值的一致使用有助于代码互操作性,避免了在不同数字类型之间转换的需要,并且匹配整数类型推断。
浮点数字
浮点数是具有小数分量的数字,例如3.14159,0.1和-273.15。
浮点类型可以表示比整数类型更宽的范围的值,并且可以存储比可以存储在Int中更大或更小的数字。 Swift提供了两种带符号的浮点数类型:
- Double表示64位浮点数。
- Float表示一个32位浮点数。
注意:Double具有至少15个十进制数字的精度,而Float的精度可以少至6个十进制数字。 要使用的适当的浮点类型取决于您需要在代码中使用的值的性质和范围。 在任一类型都适当的情况下,优选Double。
类型安全和类型推理
例如,如果将一个文本值42赋值给一个新常量,而不说它是什么类型,Swift推断出你希望该常量是一个Int,因为你已经用一个看起来像整数的数字初始化它:
let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int
同样,如果您没有为浮点文本指定类型,Swift推断出您想要创建一个Double:
let pi = 3.14159
// pi is inferred to be of type Double
Swift在推断浮点数类型时总是选择Double(而不是Float)。
如果在表达式中组合整数和浮点文本,则会从上下文中推断Double类型:
let anotherPi = 3 + 0.14159
// anotherPi is also inferred to be of type Double
3的文字值本身没有显式类型,因此从浮点文字的存在推断出适当的输出类型Double作为加法的一部分。
数字字面量
整数文字可以写成:
- 十进制数,无前缀
- 一个二进制数,带有一个0b前缀
- 一个八进制数,带有一个0o前缀
- 十六进制数,带有0x前缀所有这些整数字面值的十进制值为17:
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation
浮点文字可以是十进制(无前缀)或十六进制(具有0x前缀)。 它们必须在小数点的两边始终具有数字(或十六进制数字)。 小数浮点也可以有一个可选的指数,由大写或小写e表示; 十六进制浮点数必须具有指数,由大写或小写p表示。
对于指数为exp的十进制数,基数乘以10 exp:
- 1.25e2是指1.25×102,或125.0。
- 1.25e-2是指1.25×10 -2,或0.0125。
对于指数为exp的十六进制数,基数乘以2 exp:
- 0xFp2表示15 x 22或60.0。
- 0xFp-2表示15 x 2-2或3.75。
所有这些浮点文本的十进制值为12.1875:
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
数字文字可以包含额外的格式,以使它们更容易阅读。 整数和浮点都可以用额外的零填充,并且可以包含下划线以帮助可读性。 两种类型的格式都不会影响字面值的基础值:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1