@H_403_1@
@H_403_1@
@H_403_1@Swift 数据类型
@H_403_1@在程序语言编程时,需要使用各种数据类型来存储不同的信息。
@H_403_1@变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。所有变量都具有数据类型,以决定能够存储哪种数据。
@H_403_1@内置数据类型
Swift @H_403_1@提供了非常丰富的数据类型,以下列出了常用了几种数据类型:
@H_403_1@Int
@H_403_1@一般来说,不需要专门指定整数的长度。Swift @H_403_1@提供了一个特殊的整数类型Int@H_403_1@,长度与当前平台的原生字长相同:
@H_403_1@在32@H_403_1@位平台上,Int@H_403_1@和Int32@H_403_1@长度相同。
@H_403_1@在64@H_403_1@位平台上,Int@H_403_1@和Int64@H_403_1@长度相同。
@H_403_1@除非你需要特定长度的整数,一般来说使用Int@H_403_1@就够了。这可以提高代码一致性和可复用性。即使是在32@H_403_1@位平台上,Int@H_403_1@可以存储的整数范围也可以达到-2,147,483,648~2,647@H_403_1@,大多数时候这已经足够大了。
@H_403_1@UInt
Swift @H_403_1@也提供了一个特殊的无符号类型UInt@H_403_1@,长度与当前平台的原生字长相同:
在@H_403_1@32位平台上,@H_403_1@UInt和@H_403_1@UInt32长度相同。
在@H_403_1@64位平台上,@H_403_1@UInt和@H_403_1@UInt64长度相同。
@H_403_1@注意:
@H_403_1@尽量不要使用UInt@H_403_1@,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用Int@H_403_1@,即使你要存储的值已知是非负的。统一使用Int@H_403_1@可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断,请参考类型安全和类型推断。
@H_403_1@浮点数
@H_403_1@浮点数是有小数部分的数字,比如3.14159@H_403_1@,0.1@H_403_1@和-273.15@H_403_1@。
@H_403_1@浮点类型比整数类型表示的范围更大,可以存储比Int@H_403_1@类型更大或者更小的数字。Swift @H_403_1@提供了两种有符号浮点数类型:
Double@H_403_1@表示64@H_403_1@位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
Float@H_403_1@表示32@H_403_1@位浮点数。精度要求不高的话可以使用此类型。
@H_403_1@注意:
Double@H_403_1@精确度很高,至少有15@H_403_1@位数字,而Float@H_403_1@最少只有6@H_403_1@位数字。选择哪个类型取决于你的代码需要处理的值的范围。
@H_403_1@布尔值
Swift @H_403_1@有一个基本的布尔(Boolean@H_403_1@)类型,叫做Bool@H_403_1@。布尔值指逻辑上的值,因为它们只能是真或者假。Swift @H_403_1@有两个布尔常量,true@H_403_1@和false@H_403_1@。
@H_403_1@字符串
@H_403_1@字符串是字符的序列集合,例如:
@H_403_1@"Hello,World!"
@H_403_1@字符
@H_403_1@字符指的是单个字母,例如:
@H_403_1@"C"
@H_403_1@可选类型
@H_403_1@使用可选类型(optionals@H_403_1@)来处理值可能缺失的情况。可选类型表示有值或没有值。
@H_403_1@数值范围
@H_403_1@下表显示了不同变量类型内存的存储空间,及变量类型的最大最小值:
@H_403_1@类型 @H_403_1@大小(字节) @H_403_1@区间值
@H_403_1@Int8 1 字节@H_403_1@ -127 到@H_403_1@ 127
@H_403_1@UInt8 1 字节@H_403_1@ 0 到@H_403_1@ 255
@H_403_1@Int32 4 字节@H_403_1@ -2147483648 到@H_403_1@ 2147483647
@H_403_1@UInt32 4 字节@H_403_1@ 0 到@H_403_1@ 4294967295
@H_403_1@Int64 8 字节@H_403_1@ -9223372036854775808 到@H_403_1@ 9223372036854775807
@H_403_1@UInt64 8 字节@H_403_1@ 0 到@H_403_1@ 18446744073709551615
@H_403_1@Float 4 字节@H_403_1@ 1.2E-38 到@H_403_1@ 3.4E+38 (~6 digits)
@H_403_1@Double 8 字节@H_403_1@ 2.3E-308 到@H_403_1@ 1.7E+308 (~15 digits)
@H_403_1@类型别名
@H_403_1@类型别名对当前的类型定义了另一个名字,类型别名通过使用 typealias @H_403_1@关键字来定义。语法格式如下:
@H_403_1@typealias newname = type
@H_403_1@例如以下定义了 Int @H_403_1@的类型别名为 Feet@H_403_1@:
@H_403_1@typealias Feet = Int
@H_403_1@现在,我们可以通过别名来定义变量:
@H_403_1@import Cocoa
@H_403_1@
@H_403_1@typealias Feet = Int
@H_403_1@var distance: Feet = 100
@H_403_1@print(distance)
@H_403_1@我们使用 playground @H_403_1@执行以上程序,输出结果为:
@H_403_1@100
@H_403_1@类型安全
@H_403_1@Swift 是一个类型安全(@H_403_1@type safe)的语言。
@H_403_1@由于 Swift @H_403_1@是类型安全的,所以它会在编译你的代码时进行类型检查(type checks@H_403_1@),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。
@H_403_1@import Cocoa
@H_403_1@
@H_403_1@var varA = 42
@H_403_1@varA = "This is hello"
@H_403_1@print(varA)
@H_403_1@以上程序,会在 Xcode @H_403_1@中报错:
@H_403_1@error: cannot assign value of type 'String' to type 'Int'
@H_403_1@varA = "This is hello"
意思为不能将@H_403_1@ 'String' 字符串赋值给@H_403_1@ 'Int' 变量。
@H_403_1@类型推断
@H_403_1@当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。
@H_403_1@如果你没有显式指定类型,Swift @H_403_1@会使用类型推断(type inference@H_403_1@)来选择合适的类型。
@H_403_1@例如,如果你给一个新常量赋值42@H_403_1@并且没有标明类型,Swift @H_403_1@可以推断出常量类型是Int@H_403_1@,因为你给它赋的初始值看起来像一个整数:
@H_403_1@let meaningOfLife = 42
@H_403_1@// meaningOfLife 会被推测为@H_403_1@ Int 类型
@H_403_1@同理,如果你没有给浮点字面量标明类型,Swift @H_403_1@会推断你想要的是Double@H_403_1@:
@H_403_1@let pi = 3.14159
@H_403_1@// pi 会被推测为@H_403_1@ Double 类型
@H_403_1@当推断浮点数的类型时,Swift @H_403_1@总是会选择Double@H_403_1@而不是Float@H_403_1@。
@H_403_1@如果表达式中同时出现了整数和浮点数,会被推断为Double@H_403_1@类型:
@H_403_1@let anotherPi = 3 + 0.14159
@H_403_1@// anotherPi 会被推测为@H_403_1@ Double 类型
@H_403_1@原始值3@H_403_1@没有显式声明类型,而表达式中出现了一个浮点字面量,所以表达式会被推断为Double@H_403_1@类型。
@H_403_1@实例
@H_403_1@import Cocoa
@H_403_1@
@H_403_1@// varA 会被推测为@H_403_1@ Int 类型@H_403_1@
@H_403_1@var varA = 42
@H_403_1@print(varA)
@H_403_1@
@H_403_1@// varB 会被推测为@H_403_1@ Double 类型@H_403_1@
@H_403_1@var varB = 3.14159
@H_403_1@print(varB)
@H_403_1@
@H_403_1@// varC 也会被推测为@H_403_1@ Double 类型@H_403_1@
@H_403_1@var varC = 3 + 0.14159
@H_403_1@print(varC)
@H_403_1@42
@H_403_1@3.14159
@H_403_1@3.14159