Swift4 入门到精通(第二章基本数据类型与量值)
阅读原文时间:2023年08月09日阅读:3

第二章 量值和基本数据类型

Swift 支持的基本数据类型, 整型,浮点型,布尔型,元组,可选类型。

学习的目标:

常量与变量的意义、声明、命名规范、类型

数据进制与计算机存储原理

整型数据、浮点型数据、布尔型数据的应用

swift语言中的元祖类型和可选类型。

如何为类型取别名

2.1 变量与常量

在swift语言中,使用let关键字和var关键字分别用来表示常量和变量。

2.1.1 变量与常量的定义和使用

// 定一个一个变量,赋值字符串
var str = "Hello, swift!";

// 1 声明字符串变量str
var str: String;

// 2 对字符串变量str进行赋值
str = "Hello, Swift!";

// 更改str变量的值
str = "new value";

// 在str字符串变量后边追加hello
str = str + "hello";

Swift是一种类型安全语言,即常量或变量在声明的时候必须指明明确的类型。 Xcode编译器支持对Swift语言的类型自动推断,当声明变量时如果直接给变量赋 初值,则编译器会根据赋值的类型来确定变量的类型,之后变量的类型将不可更改。

Swift语言支持在同一行语句中声明多个常量或者变量,但是要遵守明确类型的原则。

// 编译器推断
var a = 1, b = 2.9, c = "String";

// 手动指定
var a2: Int = 1, b2: Float = 2.9, c2: String = "String";

如果在同一句代码中声明多个变量并且没有提供初始值,可以通过指定最后一个变量的类型

对整体进行类型指定。

// 声明3个Int类型的变量
var one, two, three: Int;

如果需要修改变量的值,直接对变量再赋值即可。需要注意的是,所赋值的类型

必须和变量的类型保持一致。

2.1.2 变量和常量的命名规范

在Swift语言中,常量和变量的命名规则十分广泛,可以包括Unicode字符和数字,

需要注意的是,不可使用预留关键字来作为常量或者变量的名称。

常量和变量的命名不可以数字开头,空格、数学符号、制表符、箭头符号也不可以用在命名中。

可以使用中文命名,可以使用表情符号进行命名,可以使用穿插数字进行命名。

// 使用中文进行变量的命名
var 汉字 = "汉字";

// 使用表情符号进行命名
var = "哈哈哈";

// 含有数字的命名
var pen2 = "pencile";

// 可以使用下划线进行命名
var _swift_ = "Swift";

Swift语言官方文档采用 驼峰命名的方式,所谓驼峰命名,是指,以单词进行名称的拼接。

名称的首字母一般为小写,之后每个单词的首字母大写,其他字母均小写。

// 驼峰命名
var userName = "汉字";

Swift中的命名也有一些约定俗称的规则,例如量值属性首字母会小写,类名,枚举名,结构体名首字母会大写。

如果在命名中真的需要使用预留的关键字进行命名,可使用 ` 符号进行包装,

但是如非万不得已,开发中应尽量不使用这种方式命名。

// 用预留关键字进行命名
var `var` = 2;

2.3 初识基本数据类型

2.3.1 数学进制与计算机存储原理

Swift语言支持开发者使用多种进制进行数据的定义与计算,默认为10进制,如果有特殊需求,

可以通过在数据前面加前缀的方式实现。

var type_10 = 17;

var type_2 = 0b10001;

var type_8 = 0o21;

var type_16 = 0x11;

1B = 8bit

1KB = 2^10B

1MB = 2^10KB

1GB = 2^10MB

1TB = 2^10GB

1PB = 2^10TB

2.3.2 整型数据

Swift语言中的整型数据分为有符号整型数据和无符号整型数据。

// 8位无符号整型的最大值 255
var a1 = UInt8.max;

// 16位无符号整型的最大值 65535
var a2 = UInt16.max;

// 32位无符号整型的最大值 4294967295
var a3 = UInt32.max;

// 32位无符号整型的最大值
var a4 = UInt64.max;

Swift语言中的无符号整型实际有五种,还有一种Unint类型,这种类型编译器会自动适配,在64位的机器上位

UInt64, 在32位上为Uint32.

// 获取数据类型所占位数,在64位机器砂锅UInt占8字节64位

var a5 = MemoryLayout.size;

var maxInt8 = Int8.max;

var minInt8 = Int8.min;

var maxInt16 = Int16.max;

var minInt16 = Int16.min;

var maxInt32 = Int32.max;

var minInt32 = Int32.min;

var maxInt64 = Int64.max;

var minInt64 = Int64.min;

var intSize = sizeof(Int);

2.3.3 浮点型数据

var b = MemoryLayout.size; // 4 Byte

var b1 = MemoryLayout.size; // 4 Byte

var b2 = MemoryLayout.size; // 8 Byte

var b3 = MemoryLayout.size; // 16 Byte

var c = MemoryLayout.size; // 8 Byte

Swift 语言中也支持使用科学计数法来表示数字,在十进制中使用e来表示10的n次方

在16进制中使用p来表示2的n次方。

var sum = 1.25e3;

var sum2 = 0x1p3;

Swift语言中,无论是整型数据还是浮点型数据,都可以在数字前加任意个0

来进行位数填充,也可以在数字中加入下划线进行分隔,进而增加可读性,

这些操作并不会影响原始数据,却提高了对开发者的编程友好型,使代码的结构更加清爽 。

var num1 = 001.23; // 1.23

var num2 = 1_000; // 1000

var num3 = 1_000.1_001; // 1000.1001

2.3.4 布尔型数据

var bool1 = true;

var bool2 = false;

2.4 两种特殊的基本数据类型

Swift语言还支持两种特殊的基本数据类型,分别是元组类型和可选类型。

2.4.1 元组

var pen: (name: Stirng, price: Int) = ("钢笔", 2);

// 获取pen变量的名称
var name = pen.name;

// 获取pen变量的价格
var price = pen.price;

开发者在创建元组时,也可以在不指定元组中参数的名称,元组会自动位每个参数分配下标,

下标值将从0开始依次递增。

// 不指定参数名称的元组
var car: (String, Int) = ("甭吃", 20000);

// 通过下标来获取元组中每个组成元组的值
var carName = car.0;
var carPrice = car.1;

元组实例被创建后,开发者也可以通过指定变量或者常量来分解它。

// 不指定参数名称的元组
var car: (String, Int) = ("甭吃", 200000);

// 进行元组的分解
var (theName, thePrice) = var;
print(theName, thePrice);

var (theName, _) = car;
print(theName);

在Swift语言中,常常使用符号__来表示匿名的概念,因此,__ 也被称为匿名表示标识符。

2.4.2 可选类型

Swift语言中提供了一种包装的方式来对普通类型记性Optional包装,实现对空值情况的监控。

如果一个变量在逻辑上可能位nil, 则开发者需要将其包装位Optional类型。

var obj: String?;

if obj == nil {}

在声明obj变量的时候,这里将其声明为String?类型,在普通类型后面添加符号?

即可将普通类型包装为Optional类型。

Optional类型不会独立存在,总会依附于某个具体的数据类型智商,具体的数据

类型可以是基本数据类型,可以是结构体,也可以是类。

Optional类型只有两种值,可以理解为:

- 如果其依附于类型对应的量值有具体的值,则其为具体值的包装。

- 如果其依附于类型对应的量值没有具体的值,则为nill。

Optional类型是对普通类型的一种包装,因此在使用的时候也需要对其进行拆包操作,

拆包将使用Swift中的操作符!。

!符号出现在类型后面与实例后面,它出现在类型后面代表的是一种隐式解析的语法结构。

// 声明obj为String?类型
var obj: String? = "HS";

// 进行拆包操作
obj!

在使用!进行Optional值的拆包操作时,必须保证要拆包的值不为nill。

否则程序运行会出错。可以在拆包前使用if语句进行安全判断。

var obj: String? = "HS";

if obj != nill {
obj!
}

var obj: String? = "HS";

if let tmp = obj {
print(tmp)
} else {
obj = "HS";
print(obj!);
}

Swift语言还提供了一种if-let语法结构来进行Optional类型的值的绑定操作。

if-let结构中也可以同时进行多个Optional类型的值的绑定,之间逗号隔开。

var obj1: Int? = 1;

var obj2: Int? = 2;

if let tmp1 = obj1, let tmp2 = obj2 {

print(tmp1, tmp2);

}

如果开发者需要在if语句的判断中添加更多的业务逻辑,可以通过追加子句的方式来实现。

var obj1: Int? = 1;

var obj2: Int? = 2;

if let tmp1 = obj1, let tmp2 = obj2, tmp1 < tmp2 {

print(tmp1, tmp2);

}

2.5 为类型取别名

在Swift语言中使用typealias关键字来实现类型别名的效果。

typealias Price = Int;

var penPrice: Price = 100;