首页 > 代码库 > Swift--基本数据类型(一)
Swift--基本数据类型(一)
不像更多语言中,X不要求你写一个分号(;)在你的代码中的每一个语句后,尽管能够这样做。然而,假设你想在一行中写入多个单独的语句分号是必需的:
. 1 letcat = "";println(cat)
. 2 // prints ""
数据类型
Integers
integers是整数,没有小数部分,如42和-23。整数有符号(正,零或负的)或无符号(正或零).
Swift提供8,16,32,和64位形式的符号和无符号整数。这些整数遵循类似于C的命名惯例,在一个8位无符号整数类型UINT8,以及一个32位带符号整数为Int32类型.
Integer Bounds
能够用其最小和最大属性訪问每一个整数类型的最小值和最大值
1 letminValue = UInt8.min // minValue is equal to 0, and is of type UInt8
2 letmaxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
这些属性的值是适当的大小的号码类型(如UINT8在上面的样例中),并
能够在沿着同一类型的其他值的表达式,因此能够使用。
Int
在大多数情况下,你并不须要挑选整数的特定大小在代码中使用。Swift提供了一个额外的整数类型,int,它具有同样的大小作为当前平台的本地字大小:
?在32位平台,诠释的是相同大小的Int32。
?在64位平台,诠释的是相同大小的Int64。
除非你须要用整数的特定大小的工作,总是使用int代码中的整数值。这有助于代码的一致性和互操作性。即使在32位平台上,诠释能够存储不论什么值-2,147,483,648到2,147,483,647之间,而且是很多整数范围足够大。
UInt
Swift还提供了一个无符号的整数类型,UINT,它具有同样的大小作为当前平台的本地字大小:
?在32位平台上,UINT是大小同样的UInt32。
?在64位平台上,UINT是大小同样的UInt64。
Floating-Point Numbers
浮点数与小数部分的数字,如3.14159,0.1,和-273.15。浮点类型能够表示比整数类型更广泛的范围内的值,而且能够存储数字,
是更大或更小的比能够存储在一个Int。 SWIFT提供两个有符号浮点数类型:
?双代表一个64位浮点数字。使用它时,浮点值必须是很大的,或
特别精确。
?浮点表示一个32位浮点数字。使用它时,浮点值不须要64位精度。
Type Safety and Type Inference
Swift是一种类型安全的语言。类型安全的语言鼓舞你要搞清楚值的类型代码能够工作。假设您的代码部分须要一个字符串,你不能错误地传递一个诠释。
由于Swift是类型安全的,它会运行编译你的代码和标志的不论什么类型不匹配的错误时类型检查。这使您可以捕获并尽可能早地在开发过程中修正错误。
类型检查帮助您避免错误,当您正在使用不同类型的值。可是,这并不意味着你必须指定每个常量和变量所声明的类型。假设不指定值,你须要的类型,Swift使用类型推理来制定出对应的类型。类型判断使编译器自己主动判断出特定的表达式的类型时,它编译你的代码,仅仅需通过检查您提供的值。
由于类型判断,斯威夫特须要少得多的类型声明不是语言,如C或Objective-C 。常量和变量仍然显式类型,但大部分指定其类型的工作是为你做。
当你声明一个常量或变量的初始值类型判断是特别实用的。这一般是通过赋予文本值(或文字)到所声明的地步了常量或变量进行。 (字面上的值是直接出如今源码中的值,如以下的样例42和3.14159 。 )
比如,假设您指定42到一个新的常数常值,不用说它是什么类型,Swift判断出你想要的常量是一个诠释,由于你已经初始化它与一些看起来像一个整数
. 1 letmeaningOfLife= 42
. 2 // meaningOfLife is inferred to be of typeInt
相同,假设你不指定类型的浮点字面值,Swift判断出你想要创建一个Double
:
. 1 letpi = 3.14159
. 2 // pi is inferred to be of type Double
Swift总是选择Double(而非Float)时判断浮点数类型。
假设你把在一个表达式中整数和浮点常量,一个Double类型会从上下文判断:
. 1 letanotherPi= 3 + 0.14159
. 2 // anotherPi is also inferred to be of typeDouble
Numeric Literals
整型常量能够写成:
?一个十进制数,不带前缀
?一个二进制数,用前缀0b
?一个八进制数,用0°前缀
?一个十六进制数,以0x前缀
全部这些整型常量的有17的十进制值:
. 1 letdecimalInteger= 17
2 letbinaryInteger = 0b10001 // 17 in binary notation
.
3 letoctalInteger = 0o21 // 17 in octal notation
.
4 lethexadecimalInteger = 0x11 // 17 inhexadecimal notation
.
浮点文本能够是十进制(不带前缀)或十六进制(以0x前缀)。它们必须始终具有在小数点的两側号码(或十六进制数)。他们也能够有一个可选的指数,由一个大写或小写e表示十进制浮点数表示,或大写或小写p表示十六进制浮点数
为十进制数用的exp指数,基数乘以10exp:
? 1.25e2means1.25×102,or125.0.
? 1.25e-2means1.25×10-2,or0.0125.
为十六进制数与EXP的指数,基部数乘以2EXP:
? 0xFp2means15×22,or60.0.??0xFp-2means15×2-2,or3.75.
全部这些浮点常量的有12.1875十进制值:
. 1 letdecimalDouble= 12.1875
. 2 letexponentDouble= 1.21875e1
. 3 lethexadecimalDouble= 0xC.3p0
数字文本能够包括额外的格式,使它们更easy阅读。这两个整数和浮点数能够被填充
有额外的零,而且能够包括下划线,以帮助可读性。不管类型的格式影响文本的基本价值:
. 1 letpaddedDouble= 000123.456
. 2 letoneMillion= 1_000_000
. 3 letjustOverOneMillion= 1_000_000.000_000_1
Numeric Type Conversion
使用Int类型的代码中的全部通用的整型常量和变量,即使它们是已知的非负。在日常生活中使用默认的整数类型是指整型常量和变量是在代码中直接互操作,并将匹配的类型判断为整数文字值。
仅使用时,特别须要他们手头的任务,其它整数类型,由于从外部来源明白大小的数据,或者对性能,内存使用情况,或其它必要的优化。在这些情况下使用显式大小的类型,能够捕捉不论什么意外溢出值和隐式记录所使用的数据的性质。
Integer Conversion
能够存储在一个整数常量或变量数的范围是不同的每一个数值类型。一个INT8常量或变量能够存储数-128到127之间,而一个UINT8常量或变量能够存储0到255之间的数字。一个数字,将不会放入一个大小的整数类型的常量或变量被报告为错误时你的代码被编译:
. 1 letcannotBeNegative: UInt8 = -1
. 2 // UInt8 cannot store negative numbers, andso this will report an error
. 3 lettooBig: Int8= Int8.max + 1
. 4 // Int8 cannot store a number larger thanits maximum value,
. 5 // and so this will also report an error
由于每一个数字类型能够存储不同的值的范围,你必须选择添?在逐案基础上数值类型的转换。这样的选择适用的做法能够防止隐藏的转换错误,并帮助作出明白在你的代码的类型转换意图。
要转换一个特定的数字类型到还有一个,你初始化与现有值所需类型的新号码。在以下的样例中,恒定twoThousand是类型UInt16的的,而常数1是类型UINT8的。它们不能被一起直接添?的,由于它们是同样类型的不。相反,该??演示样例调用UInt16的(一个)来创建一个变量的值初始化的新UInt16的,而且使用这个值来取代原来的:
. 1 lettwoThousand: UInt16 = 2_000
. 2 letone: UInt8 = 1
. 3 lettwoThousandAndOne= twoThousand + UInt16(one)
由于添加?了两方都类型UInt16的眼下,除了是同意的。输出常数(twoThousandAndOne)判断为类型UInt16的,由于它是两个UInt16的值的总和。
个SomeType(ofInitialValue)是默认的方式来调用雨燕类型的初始化,并传递一个初始值。在幕后,UInt16的有一个接受UINT8值的初始值设定项,因此这个初始化用于从现有UINT8作出新的UInt16的。你不能传递不论什么类型的这里,可是,它必须是一个类型的UInt16的提供了一个初始化。扩展现有类型,规定接受新的类型(包含你自己的类型定义)是覆盖在扩展初始化。
Integer and Floating-Point Conversion
. 1 letthree = 3
. 2 letpointOneFourOneFiveNine= 0.14159
. 3 letpi = Double(three) +pointOneFourOneFiveNine
. 4 // pi equals 3.14159, and is inferred to beof type Double
这里,常数3的值被用来创建Double类型的新值,从而使除了两側是同样类型的。假设没有这个转换到位,另外也不会被同意。
反过来也是如此浮点到整数的转换,在一个整数类型能够用double或float值进行初始化:
. 1 letintegerPi= Int(pi)
. 2 // integerPi equals 3, and is inferred tobe of type Int
当用于以这样的方式初始化一个新的整数值的浮点值总是被截断。这意味着,4.75变为4,和-3.9变得-3。
Type Aliases
类型别名为现有类型定义的替代名称。您能够定义类型别名与TYPEALIASkeyword。当你想用的名称是上下文更适合于指现有类型类型别名是实用的,
与来自外部源的特定大小的数据时,如
typealias AudioSample= UInt16
一旦你定义了一个类型别名,你能够使用别名的不论什么地方你可能会使用原来的名称:
. 1 varmaxAmplitudeFound= AudioSample.min
. 2 // maxAmplitudeFound is now 0
这里,AudioSample被定义为一个别名UInt16的。由于它是一个别名,调用AudioSample.min实际上是调用UInt16.min,这对于maxAmplitudeFound变量提供初始值0。