Swift入门之基本数据类型

415 阅读6分钟

let常量与var变量

在Swift中,通过关键字let声明常量,通过关键字var声明变量

let maxNum = 10
var indexNum = 1

maxNum = 1 // 对let声明的常量进行赋值时会报错
indexNum = 2 // 对var声明的变量可以执行赋值

类型注释

在声明一个常量或变量的时候,可以通过类型注释来指明,该常量或变量能够存储的类型

// 类型注释的格式,在声明常量或变量后面加一个冒号(:)
// 再加上要使用的类型名称,例如String、Num等
var name: String

// 声明多个常量或变量可以通过逗号(,)分隔
// 若不赋值,则需要添加类型注释,
// 否则会报"Type annotation missing in pattern"类型注释缺失的错误
let str1: String, str2: String
var num1: Int, num2: Float

// 如果多个常量或变量的类型相同,
// 可以在最后一个常量或变量后面加上类型注释
var str1, str2: String

Swift中的数值类型

1. 整数类型(Int、UInt)

Int和UInt会自动匹配当前平台的位数长度,例如32位平台的就是32位的Int、UInt,64位平台的就是64位的Int、UInt

当然,Swift依然有提供Int8、UInt8、Int16、UInt16等这些关键字来指定使用哪种位数长度的Int、UInt

// 可以通过min、max两个属性,打印整型数值范围
print("Int16最小值\(Int16.min),Int16最大值\(Int16.max)")

2. 浮点类型(Double、Float)

Swift提供Double(64位浮点数)、Float(32位浮点数)两个浮点类型。一般推荐使用Double类型

3. 布尔类型(Bool)

Swift提供布尔类型Bool,只有true和false两个值。Swift中的Bool类型不同于,Objective-C、C语言这类编程语言,Swift的类型安全机制,不允许非空即真,需要完整的布尔表达式

if (1) {
    print("Swift")
}
// Objective-C里可以这样利用非空即真让if语句执行
// 但在Swift里不行,会报错的

// 可以用下面的代码修复上面的代码
if (1 != 0) {
    print("Swift")
}

Swift中的元组类型(Tuple)

元组(Tuple)是将多个元素组合成一个值的复合型值类型,元组里的元素可以是任何类型的,不同元素之间的类型也可以不同。

元组里的每个元素都可以指定对应的元素名称,通过元素名称就可以索引对应元素的值了,若没有设置指定的元素名称,则使用下标的方式索引。

通过let声明的元组是不可修改的元组,通过var声明的元组是可修改的元组。

元组在创建后不能增加或删除元素,但通过var声明的元组可以对元素进行修改,不过不能改变其类型。通过指定元素类型为Any类型,则可以实现将元素修改为不同类型

let person1 = ("张三",22)
var person2 = ("李四",33)

// 通过let声明的不能修改,编译会报错
person1.1 = 20
// 通过var声明的就能修改
person2.1 = 30

// 为元素设置名称
var person3 = (name:"小白龙", age:333)
// 通过元素名称修改对应值
person3.age = 300

元组解析,可以将元组的内容,分解为单独的常量或变量,假如只解析元组部分内容,则可以通过下划线(_)将不需要的内容过滤掉

let cat = ("汉斯",2)
// 通过(name,age)解析出元组cat的内容
let (name,age) = cat
print("cat name: \(name),age: \(age)")
// 通过下划线忽略元组cat第一个元素
let (_,age1) = cat
print("cat age: \(age1)")

var cat2 = ("汤姆",3)
cat2.1 = "3" // 这个会报错,因为初始化后元素的类型就确定了,不能修改了

var cat3:(String,Any) = ("起司",1)
cat3.1 = "1" // 通过指定为Any类型就能使用不同类型了

// 设置了元素名称的,在设置类型注释的时候要带上元素名称
var cat4:(name:String,age:Any) = (name:"雪妮",age:2)

Swift中的Sting类型

// 字符串字面量
// 通过双引号包裹内容给常量或变量赋值
let str = "Hello"
// 多行字符串字面量
// 通过三引号包裹内容给常量或变量赋值
// 注意三引号独立一行,前后都不能有内容
let multiStr = """
Hello
World
!!!
"""
// 可以通过在行尾添加反斜杠(\)取消换行
let multiStr2 = """
Hello\
World
!!!
"""

// 使用初始化器初始化字符串
let str2 = String()
// 用字符串空串的字面量等价于上面用初始化器效果
let str3 = ""

Swift中的Optional可选类型

通过在常量或变量的类型后面加一个问号(?)来表示一个Optional类型,它表示这个变量可能有值也可能没有值。可以通过给可选类型的变量赋值一个nil,将该变量设置为没有值。

这里的nil与Objective-C里的nil不同,Objective-C里的nil是一个指向不存在对象的指针,是一个指针。而在Swift里,nil不是指针,它代表值缺失,和Objective-C里的概念不同。任何类型的可选值都可以设置为nil。

// 给变量赋值nil会报错的
var str: String = nil
// 而将变量指定为Optional可选类型
// 就可以将nil赋值给变量了
var str: String? = nil

Optional类型是无法直接使用的,需要利用叹号(!)展开后才能使用。而且在使用!展开时,要保证可选变量包含有一个非nil的值。

var str: String? = "Hello"
if str != nil {
// 确保str是有非nil的值后就可以使用叹号(!)展开了
    print(str!.count)
}

// 用叹号(!)展开一个没有值的可选值会报错
var str2: String? // str2 默认为nil
print(str2!.count)

可选项绑定,可以通过if和while语句与可选项绑定配合使用来判断可选项是否含有非nil值,如果有非nil值,则将值赋给一个临时的常量或变量。

一个if语句可以包含多个可选项绑定,用逗号(,)分隔,其中任一个可选项绑定结果为nil或布尔值为false,则这个if语句都判断为false。

let str: String? = "Hello"
if let realStr = str {
    print(realStr.count)
}

Optional的隐式展开,假如可选项一旦赋值后就会一直有值,则可以通过在声明的类型后面添加一个叹号(!)来表示隐式展开可选项,不需要在每次访问时都进行展开。隐式展开主要应用在Swift类的初始化过程中。

// 注意是String!而非String?,写法不同
var str: String! = "Hello"
print(str.count) // 不需要用!展开,可以直接访问了

Optional可选链,在可选项后面加问号(?)而不是叹号(!),表示若可选项的值不为nil,则返回一个可选类型的结果,否则返回nil

let str: String? = "Hello"
let count2 = str?.count // 因为Optional可选链,count2是一个可选类型的变量
if count2 != nil {
    print(count2!)
}

实际上叹号(!),问号(?)是Swift的语法糖

// 这两行代码其实一样的效果,声明了一个可选类型的常量
let str1: Optional<String> = "Hello"
let str2: String? = "World"

// 这两份代码是一样的效果的,都是展开可选项,获得可选项的值
if str1 != nil {
    print(str1.unsafelyUnwrapped.count)
}
if str2 != nil {
    print(str2!.count)
}