- Swift数据类型
- 整型
- 浮点型
- 数字表达式
- 数字类型之间的转化
- 布尔型
- 元组类型
- 可选类型
Swift数据类型
数据类型在赋值或给函数传递时的方式不同,可以分为:值类型和引用类型。
值类型 :整型、浮点型、布尔型、字符、字符串、元组、集合、枚举和结构体属于值类型。
值类型在传参和赋值的过程中它会创建一个副本,把副本传递过去,那么在函数的调用过程中它并不会影响原始的那个值
。
引用类型:类。
引用数据类型就是一种指针,它实际上在赋值和传递参数的过程中,它是将指针本身也传递过去,就是把引用传递过去,这样的话,当这个函数里在改变这个值之后,就会对原始数据进行修改。
因为传递的是一个指针,最后函数调用完成之后,这个值就有可能被改变
。
注意:引用数据类型只有一种,就是类,除了类以外的全部都是值类型
-
值类型 就是创建一个副本,把副本赋值或传递过去,这样在函数的调用过程中不会影响原始数据。
-
引用类型 就是把数据本身的引用(即:指针)赋值或传递过去,这样在函数的调用过程中会影响原始数据。
整型
数据类型 | 名称 | 说明 |
---|---|---|
Int8 | 有符号8位整型 | ---- |
Int16 | 有符号16位整型 | ---- |
Int32 | 有符号32位整型 | ---- |
Int64 | 有符号64位整型 | ---- |
Int | 平台相关的有符号整型 | 在32位平台上,Int与Int32宽度一致 在64位平台上,Int与Int64宽度一致 |
UInt8 | 无符号8位整型 | ---- |
UInt16 | 无符号16位整型 | ---- |
UInt32 | 无符号32位整型 | ---- |
UInt64 | 无符号64位整型 | ---- |
UInt | 平台相关的无符号整型 | 在32位平台上,UInt与UInt32宽度一致 在64位平台上,UInt与UInt64宽度一致 |

浮点型
数据类型 | 名称 | 说明 |
---|---|---|
Float | 32位浮点数 | 不需要很多大的浮点数时使用 |
Double | 64位浮点数 | 默认的浮点数 |
如下图:

当totalPrice1 没有声明类型时,编译器根据赋值判断出为默认的Double类型
当totalPrice2 没有声明类型时,编译器根据赋值判断出为Int类型
当totalPrice3 声明为Double类型,赋值为200的整数类型,则整数200会转化为Double类型(200.0)
数字表达式
进制数字表示
二进制数 以0b为前缀,0是阿拉伯数字,不要误认为是英文字母o, b是英文小写字母,不能大写。
八进制数, 以0o为前缀,第一个字符是阿拉伯数字0,第二字符是英文小写字母o,不能大写。
十六制数, 以0x为前缀,第一个字符是阿拉伯数字0,第二个字符是英文小写字母x,不能大写。
指数表示
如果采用十进制表示指数,使用大写或小写的e表示幂,e2表示1010。
采用十进制指数表示的浮点数示例如下:
var myMoney = 3.36e2 //3.36 x (1010)。
var interestRate = 1.56e-2 //1.56 x (10 *10)。
数字类型之间的转换
swift中数据类型不一致,必须进行强制转化。
let historyScore: UInt8 = 90
let englishScore: UInt16 = 130
//UInt16(historyScore) 本质是构造函数,构造出来的是结构体实例。UInt16本质就是结构体类型。
let totalScore = UInt16(historyScore) + UInt16(englishScore)
print(totalScore)
整型与浮点型之间的转化
在 java, C语言,C++, Object-C 中 整数转换为浮点数是自动转换的,没有什么开销,也是安全的。相反的浮点数转换为整数会被截取掉小数,可能会造成精度的丢失,是不安全的。
但是在Swift语言中整型->浮点型, 浮点型->转换成整型,这两个方向的转化都是需要强类型转化。
/**
整型与浮点型之间的转化
**/
let historyScore1: Float = 90.6
let englishScore1: UInt16 = 130
let totalScore1 = historyScore1 + Float(englishScore1)
let totalScore2 = UInt16(historyScore) + englishScore
Float和Double类型之间的转换,也是不能直接进行转化,必须要进行强制转化。

正确写法
let historyScore2: Float = 90.6
let englishScore2 = 130.0
let totalScore3 = historyScore2 + Float(englishScore2)
或
let historyScore2: Float = 90.6
let englishScore2 = 130.0
let totalScore3 = Double(historyScore2) + englishScore2
布尔型
Objective中NO和YES, TRUE和FALSE, 1对应YES或TRUE, 0对应NO和FALSE。
Swift中布尔型(Bool)只有两个值:true和false。它不能像C和Objective-C一样使用1替代true使用0替代false。
/**
布尔型
**/
var is🐎 = true
var is🐼: Bool = false
if is🐎 {
print(is🐎)
}else {
print(is🐼)
}
注意:🐎 和🐼是一个Unicode码,在计算机里存的实际上是一个编码。所以 is🐎是一个合法的关键字。
元组类型
学号(id) | 姓名(name) | 英语成绩(english_score) |
---|---|---|
1001t | 张三 | 100 |
1002 | 李四 | 90 |
元组(tuple)这个词很抽象,它是一种数据结构,在数学中应用广泛。在计算机科学中,元组是关系数据库中的基本概念,元组表中的一条记录。每列就是一个字段。
/**
元组类型
**/
var student1 = ("1001", "张三", 80, 90)
print("学生: \(student1.1) 学号:\(student1.0) 语文成绩:\ (student1.2) 英语成绩:\(student1.3)")
var student2 = (id_2:"1002", name_2:"李四", englishScore_2: 64, chineseScore_2: 80)
print("学生:\(student2.name_2) 学号:\(student2.id_2) 语文成绩:\(student2.chineseScore_2) 英语成绩:\(student2.englishScore_2)")
let (id_1, name_1, englishScore_1, chinese_score1) = student1
print("学生:\(name_1) 学号:\(id_1) 语文成绩:\(chinese_score1) 英语成绩:\(englishScore_1)")
//省略不用的第三个和第四个字段。
let (id_2, name_2, _,_) = student2
print("学生:\(name_2) 学号:\(id_2)")
可选类型
可选类型概念
Swift语言中任何一种正常的数据类型无论是常量还是变量都不能接收空值,
与java 和Objective-C不同,OC中变量和常量可以接收空值。这样设计的目的,是为了提高Swift语言本身的安全性。
但是有的时候希望某种数据类型可以接收空值,这种情况下就把这种数据类型加上问号(?)或感叹号(!),让它变成可选数据类型。
Swift为每一种数据类型提供一种可选类型(optional), 即在某个数据类型后面加上问号(?) 或感叹号(!)。
/**
可选类型
**/
var n1: Int = 10
n1 = nil //发生编译错误
let str: String = nil //发生编译错误
//以下为正确写法====================
var n3: Int? = 10
n3 = nil
var n4: Int! = 20
n4 = nil
let str2: String! = nil
可选类型值拆包
/**
可选类型值拆包
**/
//var n5: Int? = 10
//print(n5) //输出Optional(10)
//print(n5 + 100) //发生编译错误
//============以下为正确写法============
var n6: Int? = 10
print(n6! + 100) //使用问号(?)声明的可选类型,在拆包时需要使用感叹号(!),显示拆包(强制拆包)。
var n7: Int! = 100
print(n7 + 200) //使用感叹号(!) 声明的可选类型,在拆包时可以不使用感叹号(!), 隐式拆包。
秘籍口诀
- 前“问” 后“感”, 前“感”后省!!!
- 解释:
1、前面声明使用问号,后面拆包时要使用感叹号。
2、前面声明使用感叹号,后面拆包时可以省略感叹号。
可选绑定
不能对一个空值的可选类型进行拆包,
如下:

/**
可选绑定
**/
func divide(n1: Int, n2: Int) ->Double? {
if n2 == 0 {
return nil
}
return Double(n1)/Double(n2)
}
//let result_1: Double? = divide(n1:100, n2: 0)
//let s = result_1! + 100 //不能对空值的可选类型进行拆包
//if result_1 != nil {
// let s = result_1! + 100
//}
//============以下写法为可选绑定=================
if let result_1 = divide(n1: 100, n2: 0){
print(result_1)//这边的result_1已经不是可选类型了,所以没有必要进行拆包处理了。
print("Success.")
}else {
print("failure.")
}
while let result_2 = divide(n1: 100, n2: 0){
print(result_2) //这边的result_1已经不是可选类型了,所以没有必要进行拆包处理了。
print("Success.")
}
注意: result_1已经不是可选类型了,所以没有必要进行拆包处理了。result_1是一个正常的普通的类型,而不是一个可选类型。
网友评论