课程表

Swift课程

工具箱
速查手册

Swift 数据类型

当前位置:免费教程 » 移动开发 » Swift

在我们使用任何程序语言编程时,需要使用各种数据类型来存储不同的信息。

变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。

所有变量都具有数据类型,以决定能够存储哪种数据。


内置数据类型

Swift 提供了非常丰富的数据类型,以下列出了常用了几种数据类型:

Int

一般来说,你不需要专门指定整数的长度。Swift 提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:

  • 在32位平台上,IntInt32长度相同。
  • 在64位平台上,IntInt64长度相同。

除非你需要特定长度的整数,一般来说使用Int就够了。这可以提高代码一致性和可复用性。即使是在32位平台上,Int可以存储的整数范围也可以达到-2,147,483,648~2,147,483,647,大多数时候这已经足够大了。

UInt

Swift 也提供了一个特殊的无符号类型UInt,长度与当前平台的原生字长相同:

  • 在32位平台上,UIntUInt32长度相同。
  • 在64位平台上,UIntUInt64长度相同。

注意:
尽量不要使用UInt,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用Int,即使你要存储的值已知是非负的。统一使用Int可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断,请参考类型安全和类型推断

浮点数

浮点数是有小数部分的数字,比如3.141590.1-273.15

浮点类型比整数类型表示的范围更大,可以存储比Int类型更大或者更小的数字。Swift 提供了两种有符号浮点数类型:

  • Double表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
  • Float表示32位浮点数。精度要求不高的话可以使用此类型。

注意:
Double精确度很高,至少有15位数字,而Float最少只有6位数字。选择哪个类型取决于你的代码需要处理的值的范围。

布尔值

Swift 有一个基本的布尔(Boolean)类型,叫做Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift 有两个布尔常量,true和false。

字符串

字符串是字符的序列集合,例如:

  1. "Hello, World!"

字符

字符指的是单个字母,例如:

  1. "C"

可选类型

使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示有值或没有值。


数值范围

下表显示了不同变量类型内存的存储空间,及变量类型的最大最小值:

类型 大小(字节) 区间值
Int8 1 字节 -127 到 127
UInt8 1 字节 0 到 255
Int32 4 字节 -2147483648 到 2147483647
UInt32 4 字节 0 到 4294967295
Int64 8 字节 -9223372036854775808 到 9223372036854775807
UInt64 8 字节 0 到 18446744073709551615
Float 4 字节 1.2E-38 到 3.4E+38 (~6 digits)
Double 8 字节 2.3E-308 到 1.7E+308 (~15 digits)

类型别名

类型别名对当前的类型定义了另一个名字,类型别名通过使用 typealias 关键字来定义。语法格式如下:

  1. typealias newname = type

例如以下定义了 Int 的类型别名为 Feet:

  1. typealias Feet = Int

现在,我们可以通过别名来定义变量:

  1. import Cocoa
  2.  
  3. typealias Feet = Int
  4. var distance: Feet = 100
  5. print(distance)

在线运行实例

我们使用 playground 执行以上程序,输出结果为:

  1. 100

类型安全

Swift 是一个类型安全(type safe)的语言。

由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。

  1. import Cocoa
  2.  
  3. var varA = 42
  4. varA = "This is hello"
  5. print(varA)

以上程序,会在 Xcode 中报错:

  1. error: cannot assign value of type 'String' to type 'Int'
  2. varA = "This is hello"

意思为不能将 'String' 字符串赋值给 'Int' 变量。


类型推断

当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。

如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。

例如,如果你给一个新常量赋值42并且没有标明类型,Swift 可以推断出常量类型是Int,因为你给它赋的初始值看起来像一个整数:

  1. let meaningOfLife = 42
  2. // meaningOfLife 会被推测为 Int 类型

同理,如果你没有给浮点字面量标明类型,Swift 会推断你想要的是Double:

  1. let pi = 3.14159
  2. // pi 会被推测为 Double 类型

当推断浮点数的类型时,Swift 总是会选择Double而不是Float。

如果表达式中同时出现了整数和浮点数,会被推断为Double类型:

  1. let anotherPi = 3 + 0.14159
  2. // anotherPi 会被推测为 Double 类型

原始值3没有显式声明类型,而表达式中出现了一个浮点字面量,所以表达式会被推断为Double类型。

实例

  1. import Cocoa
  2.  
  3. // varA 会被推测为 Int 类型
  4. var varA = 42
  5. print(varA)
  6.  
  7. // varB 会被推测为 Double 类型
  8. var varB = 3.14159
  9. print(varB)
  10.  
  11. // varC 也会被推测为 Double 类型
  12. var varC = 3 + 0.14159
  13. print(varC)

在线运行实例

执行以上代码,输出结果为:

  1. 42
  2. 3.14159
  3. 3.14159

类型安全和类型推断

本节参考:http://www.cnblogs.com/nj20091571/p/4401104.html

Swift是一种类型安全的语言。类型安全的语言鼓励推荐在你代码中的值尽量要清楚其所属的类型。如果在你的代码中有一个预先好的字符串,你就不能错误地把他传递或者赋值给一个整数。

因为Swift是类型安全的,当编译你的代码时就会做类型检测并且以错误的方式标识出所有的不匹配的类型。这样使你能够在开发过程中捕获尽早的定位错误。

类型检测能帮助你避免你在不同类型之间工作时出现错误,这意并不意味着你必须为每一个声明的常量和变量指定一个明确的类型。如果你不为你需要的值指定类型,Swift就会用类型推断来计算出其恰当的类型。类型推断能够让编译器在编译你的代码时自动的推断出特定代表式的类型.能够简单的检测你提供的值。

因为类型推断,Swift需要比其它语言(C 或者 Objective-C)定义更少的类型。常量和变量还是要明确的类型,但是指定它们类型的工作不需要你来做。

类型推断在通过一个初始值来声明常量或变量时特别有用。在你创建一个常量或一个变量时经常为他们指定分配一个字面值(字面值是直接出现在你的代码中的,比如下面例子中的42,3,14159)。

例如,如果你为一个新的常量并且没有指定茏类型通过分配一个值为42的字面量时,Swift能够推断出你想这个常量的类型为是一个Int,因为你用一个整数来初始化了它的值:

  1. let meaningOfLift = 42
  2. // 类型推断 推断出它的类型为Int

同样的,你不需要指定为一个字面浮点数指定类型,Swift能够推断出你想创建一个Double类型的变量。

  1. let pi = 3,14159
  2. // pi 的类型为Double

Swift在浮点数据类型推断时总是选择Double。

如果你在一个表达式中把一个整数一个浮点数据的字面量相加,类型推断将会通过上下文推断出的类型为Double:

  1. let anotherPi = 3 + 0.14159
  2. // anotherPi的类型也为Double

“3”的字面量值没有明确的类型(显示类型),所以输出的类型Double是通过存在的浮点数部分的字面值推断出来的。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号