# Swift 数据类型

> 原文： [https://www.programiz.com/swift-programming/data-types](https://www.programiz.com/swift-programming/data-types)

#### 在本教程中，您将了解 Swift 编程语言支持的不同数据类型，并在创建变量或常量时使用它。

数据类型是变量或常量可以存储在其中的数据（值）的类型。 例如，在文章 [Swift 变量和常量](/swift-programming/variables-constants-literals "Swift variables and constants")中，您创建了一个变量和一个常量以将字符串数据存储在内存中。

该数据可以是文本/字符串（`"Hello"`）或数字（12.45），也可以是位（`0 & 1`）。 定义数据类型可确保仅存储定义的数据类型。

**让我们看一个场景**：

假设您要创建一个游戏。 由于大多数游戏在游戏完成后都会显示高分和玩家姓名，因此您需要为游戏存储这两个数据。

高分是一个数字（例如 59），玩家的名字是一个字符串（例如 Jack）。 您可以创建两个变量或常量来存储数据。

在 Swift 中，这可以通过将变量和数据类型声明为：

```swift
var highScore:Int = 59
var playerName:String = "Jack"
```

在这里，我们声明了类型为`Int`的`highScore`变量，该变量存储了值 59。并且，类型为`String`的`playerName`变量，其存储了值`Jack`。

但是，如果您执行以下操作：

```swift
var highScore:Int = "Jack"
```

您将得到一个编译时错误，指出 ***无法将类型'String'的值转换为指定的类型'Int'*** 。

这是因为您声明了`highScore`存储整数值，但在其中放置了字符串。 此错误可确保`highScore`仅能存储数字，而不能存储玩家的姓名。

* * *

## 数据类型的大小

数据类型的另一个重要部分是其大小。 这指定了可以存储在给定变量或常量中的数据大小。

**类型的**大小以位为单位进行测量，最多可以存储`2^bit`的值。 如果您不了解`bit`，请将其视为 0 或 1 的值。

因此，对于大小为 1 位的**类型**，它最多只能存储`2^1 = 2`，两个值：0 或 1。所以 1 字母程序的位系统可以将 0 解释为`a / 0`，将 1 解释为`b / 1.0`。

```swift
0 -> a or 0 
1 -> b or 1
```

同样，两位系统最多可以存储`2^2 = 4`个值：（`00,01,10,11`），每个组合可以表示为：

```swift
00 -> a or 0
01 -> b or 1
11 -> c or 2
10 -> d or 3
```

对于 n 位系统，它最多可以在其中存储`2^n`值。

* * *

## Swift 数据类型

下面列出了 swift 中最常用的数据类型：

### 布尔

*   声明为`Bool`类型的变量/常量只能存储`true`或`false`两个值。
*   **默认值**：`false`
*   当您使用`if-else`语句时，经常使用它。 [Swift `if-else`](/swift-programming/if-else-statement "Swift if else statement")文章将对此进行详细介绍。

#### 示例 1：布尔数据类型

```swift
let result:Bool = true
print(result)
```

运行该程序时，输出为：

```swift
true
```

* * *

### 整数

*   声明为整数类型的变量/常数可以存储正整数和负整数，包括零且无小数部分。
*   **默认值**：0
*   **大小**：32/64 位取决于平台类型。
*   **范围**：-2,147,483,648 至 2,147,483,647（32 位平台）
    -9223372036854775808 至 9223372036854775807（64 位平台）
*   有很多`Integer`类型的变体，例如`UInt`，`Int8`，`Int16`等。最常用的是`Int`。
*   如果需要指定变量/常量可以容纳的整数的大小/类型，则可以使用`UInt`，`Int8`和`Int16`等更具体地存储它，我们将在下面进行探讨。

#### 示例 2：整数数据类型

```swift
var highScore:Int = 100
print(highScore)

highScore = -100
print(highScore) 
```

运行该程序时，输出为：

```swift
100
-100 
```

在上面的示例中，我们声明了类型为`Int`的变量`highScore`。 首先，我们为其分配了一个值 100，因此`print(highScore)`在屏幕上输出 100。

稍后，我们使用赋值运算符将`highScore = -100`的值更改为-100，因此`print(highScore)`在屏幕上输出 -100。

* * *

让我们探索 Swift 中`Int`类型的一些变体。

#### Int8

*   可以存储正数和负数的整数类型的变体。
*   **默认值**：0
*   **大小**：8 位
*   **范围**：-128 至 127

一个`Int8`整数可以总共存储`2^8 = 256`个值。 即它可以存储 0 到 255 之间的数字，对不对？

是的，你是对的。 但是由于`Int8`同时包含正数和负数，我们可以存储从 -128 到 127 的数字，其中包括 0，总计为 256 个值或数字。

```swift
var highScore:Int8 = -128//ok
highScore = 127 //ok
highScore = 128 // error here
highScore = -129 //error here 
```

您还可以使用 [Swift 函数](/swift-programming/functions "Swift functions")内置的`.min`和`.max`找出类型可以存储的最高和最低值。

**示例 3：`Int8`数据类型的`Max`和`Min`**

```swift
print(Int8.min)
print(Int8.max) 
```

运行该程序时，输出为：

```swift
-128
127
```

* * *

#### UInt

*   整数类型的变体，称为`UInt`（无符号整数），只能存储无符号数字（正数或零）。
*   **默认值**：0
*   **大小**：32/64 位取决于平台类型。
*   **范围**：0 至 4294967295（32 位平台）
    0 至 18446744073709551615（64 位平台）

**示例 4：`UInt`数据类型**

```swift
var highScore:UInt = 100
highScore = -100//compile time error when trying to 
```

上面的代码将给您一个编译时错误，因为无符号整数只能存储 0 或正值。 尝试在无符号整数中存储负值会给您一个错误。

* * *

### 浮动

*   声明为浮点型的变量或常量可以存储带小数点或小数点的数字。
*   **默认值**：0.0
*   **大小**：32 位浮点数。
*   **范围**：`1.2 * 10^-38`至`3.4 * 10^38`（`~6`位数字）

#### 示例 5：浮点数据类型

```swift
let highScore:Float = 100.232
print(highScore) 
```

运行该程序时，输出为：

```swift
100.232
```

* * *

### 双重

*   声明为`Double`类型的变量/常量也将带小数点或小数点的数字存储为`Float`，但比`Float`支持的小数点大。
*   **默认值**：0.0
*   **大小**：64 位浮点数。 （因此，Double 类型的变量可以存储带小数或小数点大于 Float 支持的数字）
*   **范围**：`2.3 * 10^-308`至`1.7 * 10^308`（`~15`位数字）

#### 示例 6：双精度数据类型

```swift
let highScore:Double = 100.232321212121
print(highScore) 
```

运行该程序时，输出为：

```swift
100.232321212121
```

* * *

### 字符

*   声明为`Character`类型的变量/常量可以存储单字符字符串文字。
*   您可以使用转义序列`\u{n}`（unicode 码点，n 为十六进制）在 Swift 中将表情符号或英语以外的其他语言作为字符包含在内。

#### 示例 7：字符数据类型

```swift
let playerName:Character = "J"
let playerNameWithUnicode:Character = "\u{134}"
print(playerName)
print(playerNameWithUnicode) 
```

运行该程序时，输出为：

```swift
J
Ĵ
```

* * *

### 字符串

*   声明为`String`类型的变量或常量可以存储字符集合。
*   **默认值**：`""`（空字符串）
*   它是值类型。 请参见*快速值和引用类型*。
*   您可以使用`for-in`循环遍历字符串。 *参见* [Swift `for-in`循环](/swift-programming/for-in-loop "Swift for-in loop")。
*   Swift 还支持一些特殊的转义序列以在字符串中使用它们。 例如，
    *   `\0`（空字符），
    *   `\\`（普通的反斜杠\），
    *   `\t`（制表符），
    *   `\v`（垂直标签），
    *   `\r`（回车），
    *   `\"`（双引号），
    *   `\'`（单引号），以及
    *   `\u{n}`（unicode 码点，n 为十六进制）。

#### 示例 8：字符串数据类型

```swift
let playerName = "Jack"
let playerNameWithQuotes = "\"Jack\""
let playerNameWithUnicode = "\u{134}ack"
print(playerName)
print(playerNameWithQuotes)
print(playerNameWithUnicode) 
```

运行该程序时，输出为：

```swift
Jack
"Jack"
Ĵack

```

请参阅 [Swift 字符和字符串](/swift-programming/characters-strings "Swift characters and strings")，以了解有关字符和字符串的声明，操作和示例的更多信息。

除此数据类型外，Swift 中还有其他高级数据类型，例如**元组**，**可选**，**范围**，**类**，**结构**等，您将在后面的章节中学习。

* * *

## 要记住的事情

1.由于 Swift 是一种类型推断语言，因此变量或常量可以根据存储的值自动推断类型。 因此，您可以在创建变量或常量时跳过类型。 但是，出于可读性考虑，您可以考虑编写该类型，但不建议这样做。

**示例 9：类型推断的变量/常量**

```swift
let playerName = "Jack"
print(playerName) 
```

Swift 编译器可以根据其值自动推断该变量为`String`类型。

2\. Swift 是一种类型安全的语言。 如果将变量定义为某种类型，则以后不能使用其他数据类型对其进行更改。

**示例 10：Swift 是一种类型安全的语言**

```swift
let playerName:String
playerName = 55 //compile time error 
```

上面的代码将产生一个错误，因为我们已经指定变量`playerName`将为`String`。 因此我们无法在其中存储一个整数。