iOS Swift基础语法(二)

2018-07-04 09:37:14 浏览数 (1)

2、基本数据类型

这里介绍一下Swift的基本数据类型:整数、浮点数、布尔型、可选型和元组,其它较复杂的后面再介绍。Swift中的数据类型的首字母都是大写的。

2.1、整数

整数的定义为没有小数部分的数字,可以带有正负号,Swift提供了IntUInt两种整数类型,分别表示有符号和无符号的整数类型。在IntUInt后面可以带有数字8、16、32和64,以表示8、16、32、64位的整数。另外,整数类型都有属性maxmin,分别表示不同整数类型的最大值和最小值,在Swift中访问属性采用“点方法”。

Int8 与 UInt8 类型

2.2、浮点数

浮点数是指有小数部分的数字,比如3.1415926。Swift提供了两种浮点数类型:FloatDouble,Float表示32位浮点数,而Double表示64位浮点数,选择哪种类型的浮点数取决于你对精度的要求。

2.3、布尔型

Swift提供了一个非真即假的逻辑类型--布尔类型(Bool)。布尔类型有两个常量:truefalse。需要注意的是,Swift中的布尔类型不同于OC中的BOOL类型,不再接受0代表false、1代表true的用法,如下代码所示。

代码语言:javascript复制
//正确
if true {
    let num = 1
}
//错误
if 1 {
    let num = 1
}
2.4、元组类型

元组是Swift中非常好用的一个数据类型,它可以把多个值成员复合成一个值,并且这些成员的数据类型可以不同,把成员值放到一个括号中,以逗号分隔。比如一个学生的身份信息:

代码语言:javascript复制
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

另外,如果想要获取元组中的某些重要部分加以利用,忽略一些不重要的信息时,可以把元组的值传递到一个新的元组中,在新元组中声明那些接受重要值的值成员,而不重要的使用下划线“_”表示忽略。例如上例中,只关心学生信息的学生姓名,那么可以使用下面的语句,元组中的成员可以直接当作常量和变量使用:

代码语言:javascript复制
let (showName,_,_) = message2
print("Name is (showName)")
2.5、可选型

可选型用于某些不确定是否有值的情况,其有两个返回值:具体的值和nil,nil表示空值。OC中没有可选型这种数据类型,可选型是Swift都有的。定义可选型只需在常规类型后面加一个问号?即可,例如:

代码语言:javascript复制
var age : Int?

这样,age就被定义成一个可选型,如果它有值,就一定会返回一个Int类型的值,否则返回nil。可选型经常被用作搜索或者转型方法的返回值类型,这是因为在搜索和转型中经常出现失败的情况。介绍一个转型的例子,在Swift中,String类型可以和Int类型的实例相互转换,你可以把诸如"12"这样的字符串转换成Int,但是不能转换“小明”这样的字符串,Swift风格的转型使用构造器。如图2.5所示。

图2.5

值得注意的是,age在定义为Int类型的可选型之后被赋予了一个默认的初始值nil,这也是可选型的一个好处之一。 看一下下面的代码:

代码语言:javascript复制
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,则此时返回“??”之后的非可选型的值。使用“??”改造上面的代码,如下所示:

代码语言:javascript复制
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-letguard-let-else。首先来看if-let结构:

代码语言:javascript复制
var age:Int? = Int("12")
if let a = age {
    print(a)
}

类似于if语句,当age不为空的时候,对age解包并给其一个“别名”a,在if后的大括号中对a才有效果,此时a的值为12,已经解包。如果agenil,那么大括号中的代码不会执行,使用可选解包程序不会崩溃。guard-let-elseSwift2.2新引入的格式,示例如下:

代码语言:javascript复制
var age:Int? = Int("12")
func findA() {
    guard let a = age else {
        print("终止方法")
        return //终止方法
    }
    print(a) //在外部使用解包后的值
}

不同于if-let,guard-let-else首先处理agenil的情况,在此种情况中必须在大括号中使用return或者break提前终止代码。这里不管有多少个guard-let-else,别名a的作用域都在最外层,有效地避免了过于深入的嵌套。

0 人点赞