# 常量和变量以及基本类型\_1

\#Swift\
\#开发语言学习

## 1. 常量和变量

常量使用`let`声明，变量使用`var`声明；

声明时可以不用指定类型(类型注解)，会根据初始化的值来推断类型。

```swift

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

```

如果常量或者变量在声明时不初始化，则需要指定类型注解。

```swift
let a : Int

var b : String

```

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-02%20%E4%B8%8A%E5%8D%885.52.10.png)

常量或者变量可以在声明后，再赋予初值

```swift

let a : Int
var b : String

a = 12
b = "Hello World"

```

常量一旦赋予了初值，就不可以再修改

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-02%20%E4%B8%8A%E5%8D%885.57.49.png)

***

可选类型的变量可以不初始化默认值为nil；非可选类型的变量和常量只有在初始化后才能够使用；

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-05%20%E4%B8%8A%E5%8D%8812.39.28.png)

## 2. 整数类型

Swift提供了8，16，32和64位的有符号和无符号的整数类型。

`Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32,UInt64`

### 2.1 整数范围

可以通过访问不同类型的`max`和`min`属性获取对应类型的最大值和最小值。

```swift
let minValue = UInt8.min  // minValue 为 0，是 UInt8 类型
let maxValue = UInt8.max  // maxValue 为 255，是 UInt8 类型
```

### 2.2 Int 和 UInt

Swift 提供了一个特殊的整数类型 Int，长度与当前平台的原生字长相同：

* 在32位平台上，Int 和 Int32 长度相同。
* 在64位平台上，Int 和 Int64 长度相同。

> 除非你需要特定长度的整数，一般来说使用 Int 就够了。这可以**提高代码一致性和可复用性**

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

* 在32位平台上，UInt 和 UInt32 长度相同。
* 在64位平台上，UInt 和 UInt64 长度相同。

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

***

## 3. 浮点数类型

Swift 提供了两种有符号浮点数类型：

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

> Double 精确度很高，至少有 15 位小数，而 Float 只有 6 位小数。选择哪个类型取决于你的代码需要处理的值的范围，在两种类型都匹配的情况下，将**优先选择 Double**。

## 4. 数值型字面量

整数字面量可以被写作：

* 一个十进制数，没有前缀
* 一个二进制数，前缀是 0b
* 一个八进制数，前缀是 0o
* 一个十六进制数，前缀是 0x

```swift
let decimalInteger = 17
let binaryInteger = 0b10001       // 二进制的17
let octalInteger = 0o21           // 八进制的17
let hexadecimalInteger = 0x11     // 十六进制的17
```

浮点字面量可以是十进制（没有前缀）或者是十六进制（前缀是 0x ）。小数点两边必须有至少一个十进制数字（或者是十六进制的数字）。十进制浮点数也可以有一个可选的指数（exponent)，通过大写或者小写的 e 来指定；十六进制浮点数必须有一个指数，通过大写或者小写的 p 来指定。

如果一个十进制数的指数为 exp，那这个数相当于基数和10^exp 的乘积：

* 1.25e2 表示 1.25 × 10^2，等于 125.0。
* 1.25e-2 表示 1.25 × 10^-2，等于 0.0125。

如果一个十六进制数的指数为 exp，那这个数相当于基数和2^exp 的乘积：

* 0xFp2 表示 15 × 2^2，等于 60.0。
* 0xFp-2 表示 15 × 2^-2，等于 3.75。

```swift

let decimalDouble = 12.1875

let exponentDouble = 1.21875e1

let hexadecimalDouble = 0xC.3p0  // ( 12 + 3 / 16 ) * 2 ^ 0 = 12.1875
```

***

## 5. Bool类型

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

```swift
let orangesAreOrange = true
let turnipsAreDelicious = false
```

***

## 6. 数值类型转换

Swift对于数值类型非常重要的一点是：**Swift中不同的数值类型在结合使用时，不会出现隐式的转换。**

而C/C++/Objc语言中，基本的数值类型在结合前，会隐式转换为相同的类型

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-02%20%E4%B8%8B%E5%8D%8812.43.34.png)

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-02%20%E4%B8%8B%E5%8D%8812.44.39.png)

在不同的数值类型结合使用时，需要显式转换为相同的类型

```c++

let a : Int8 = 11

let b : Double = 14

let c = a + Double(b)

```

**Swift中，当数值类型在计算中超出了自己的范围，将会报错**

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-02%20%E4%B8%8B%E5%8D%8812.49.20.png)

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-02%20%E4%B8%8B%E5%8D%8812.49.50.png)

![](https://pic.existorlive.cn/%E6%88%AA%E5%B1%8F2020-11-02%20%E4%B8%8B%E5%8D%8812.50.12.png)

***

## 7. 类型安全和类型推断

Swift 是一个 **类型安全**（type safe） 的语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果你的代码需要一个 String，你绝对不可能不小心传进去一个 Int。

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

**类型推断**：

Swift在声明变量或常量时，可以不指定变量或常量的类型，由初始化的值推断出变量或者常量的类型。

```swift
let a = 123        // a是Int型，整型字面值推断为Int

let b = 12.3       // b是Double型，浮点数字面值推断为Double

```

***

## 8. typealias 类型别名

```swift
typealias AudioSample = UInt16   // 声明AudioSample为UInt16的别名
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gitbook.existorlive.cn/kai-fa-yu-yan-xue-xi/swift/1.-ji-chu-bu-fen/1.-chang-liang-he-bian-liang-yi-ji-ji-ben-lei-xing-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
