2、基本数据类型
这里介绍一下Swift
的基本数据类型:整数、浮点数、布尔型、可选型和元组,其它较复杂的后面再介绍。Swift
中的数据类型的首字母都是大写的。
2.1、整数
整数的定义为没有小数部分的数字,可以带有正负号,Swift
提供了Int
和UInt
两种整数类型,分别表示有符号和无符号的整数类型。在Int
和UInt
后面可以带有数字8、16、32和64,以表示8、16、32、64位的整数。另外,整数类型都有属性max
和min
,分别表示不同整数类型的最大值和最小值,在Swift
中访问属性采用“点方法”。
Int8 与 UInt8 类型
2.2、浮点数
浮点数是指有小数部分的数字,比如3.1415926。Swift
提供了两种浮点数类型:Float
和Double
,Float
表示32位浮点数,而Double
表示64位浮点数,选择哪种类型的浮点数取决于你对精度的要求。
2.3、布尔型
Swift
提供了一个非真即假的逻辑类型--布尔类型(Bool
)。布尔类型有两个常量:true
和false
。需要注意的是,Swift
中的布尔类型不同于OC
中的BOOL
类型,不再接受0代表false
、1代表true
的用法,如下代码所示。
//正确
if true {
let num = 1
}
//错误
if 1 {
let num = 1
}
2.4、元组类型
元组是Swift
中非常好用的一个数据类型,它可以把多个值成员复合成一个值,并且这些成员的数据类型可以不同,把成员值放到一个括号中,以逗号分隔。比如一个学生的身份信息:
let message = ("小傅","18","高三一班")
这个元组类型就可以表达出一个高三一班名叫小傅的18岁同学,结构非常精简。元组中的每个成员值都有一个默认的索引,我们可以通过索引直接获取元组中各部分的值,比如:
代码语言:javascript复制let name = message.0
let age = message.1
let grage = message.2
在playground
中显示如图2.4所示
图2.4
我们可以自定义每个成员变量的名字,格式为(成员名称1:成员值1,成员名称2:成员值2,······),调用的时候可以使用名称调用:
代码语言:javascript复制let message2 = (name:"小傅",age:"18",grade:"高三一班")
let name2 = message2.name
let age2 = message2.age
let grade2 = message2.grade
另外,如果想要获取元组中的某些重要部分加以利用,忽略一些不重要的信息时,可以把元组的值传递到一个新的元组中,在新元组中声明那些接受重要值的值成员,而不重要的使用下划线“_
”表示忽略。例如上例中,只关心学生信息的学生姓名,那么可以使用下面的语句,元组中的成员可以直接当作常量和变量使用:
let (showName,_,_) = message2
print("Name is (showName)")
2.5、可选型
可选型用于某些不确定是否有值的情况,其有两个返回值:具体的值和nil
,nil
表示空值。OC
中没有可选型这种数据类型,可选型是Swift
都有的。定义可选型只需在常规类型后面加一个问号?
即可,例如:
var age : Int?
这样,age
就被定义成一个可选型,如果它有值,就一定会返回一个Int
类型的值,否则返回nil
。可选型经常被用作搜索或者转型方法的返回值类型,这是因为在搜索和转型中经常出现失败的情况。介绍一个转型的例子,在Swift
中,String
类型可以和Int
类型的实例相互转换,你可以把诸如"12"
这样的字符串转换成Int
,但是不能转换“小明”
这样的字符串,Swift
风格的转型使用构造器。如图2.5所示。
图2.5
值得注意的是,age
在定义为Int
类型的可选型之后被赋予了一个默认的初始值nil
,这也是可选型的一个好处之一。
看一下下面的代码:
var age : Int?
age = Int("12")
print("age is (age)")
你可能认为代码第三行应该输出的应该是“age is 12”
,但是实际情况并不是这样,如图2.6所示。
图2.6
在输出语句中我们得到的age
的值显示为Optional(12)
,Optional
代表可选,age
的当前值为一个整数类型的可选型。在实际开发中我们真正需要的是括号中的12
,想要获取这个12
,就需要使用“解包”
操作。 解包是针对于可选类型的变量操作,当我们确定一个可选型的值不为nil
的时候,可以使用解包获取其中的值。它的表现形式也非常简单,在需要进行解包的变量名后面加上一个感叹号!
。现在对age
变量进行解包,效果如图2.7所示。
图2.7
最后需要指出的是,声明一个可选型虽然可以通过编译器设置的安全性检查,但是如果你不慎忘记在之后对其赋值,那么在解包的时候程序就会崩溃。所以我们在声明一个对象的时候,尤其是声明类或者结构体的属性的时候,应该三思而后行,尽可能为其赋初始值,当然这个初始值应该是明显区别于正常值的。再把可选型转换成非可选型的赋值语句中经常用到“??”
操作符,“??”
之前为一个可选型,“??”
之后为一个非可选型的值。“??”
操作符自带解包功能,在赋值时“??”
会检查其之前的可选型:如果可选型不为nil
,则将其解包并返回;如果其为nil
,则不会返回nil
,则此时返回“??”
之后的非可选型的值。使用“??”
改造上面的代码,如下所示:
var age:Int //这里避免解包,声明age为非可选型
age = Int("12") ?? -1
print("age is (age)") //转型成功
age = Int("小明") ?? -1
print("age is (age)") //转型失败
运行结果如图2.8
图2.8 “??操作符”
由于在真实的数据环境中年龄不可能为负数,此时当我们看到age
为-1的时候就知Int(String)
转型失败了。
Swift
提供了一种更安全的解包方式:可选绑定。可选绑定有两种格式可选:if-let
和guard-let-else
。首先来看if-let
结构:
var age:Int? = Int("12")
if let a = age {
print(a)
}
类似于if
语句,当age
不为空的时候,对age
解包并给其一个“别名”a
,在if
后的大括号中对a
才有效果,此时a
的值为12,已经解包。如果age
为nil
,那么大括号中的代码不会执行,使用可选解包程序不会崩溃。guard-let-else
是Swift2.2
新引入的格式,示例如下:
var age:Int? = Int("12")
func findA() {
guard let a = age else {
print("终止方法")
return //终止方法
}
print(a) //在外部使用解包后的值
}
不同于if-let
,guard-let-else
首先处理age
为nil
的情况,在此种情况中必须在大括号中使用return
或者break
提前终止代码。这里不管有多少个guard-let-else
,别名a
的作用域都在最外层,有效地避免了过于深入的嵌套。