美文网首页
iOS Swift基础语法(二)

iOS Swift基础语法(二)

作者: 傅hc | 来源:发表于2017-07-17 23:18 被阅读44次

    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的用法,如下代码所示。

    //正确
    if true {
        let num = 1
    }
    //错误
    if 1 {
        let num = 1
    }
    
    2.4、元组类型

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

    let message = ("小傅","18","高三一班")
    

    这个元组类型就可以表达出一个高三一班名叫小傅的18岁同学,结构非常精简。元组中的每个成员值都有一个默认的索引,我们可以通过索引直接获取元组中各部分的值,比如:

    let name = message.0
    let age = message.1
    let grage = message.2
    

    playground中显示如图2.4所示

    图2.4

    我们可以自定义每个成员变量的名字,格式为(成员名称1:成员值1,成员名称2:成员值2,······),调用的时候可以使用名称调用:

    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-letguard-let-else。首先来看if-let结构:
    var age:Int? = Int("12")
    if let a = age {
        print(a)
    }
    

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

    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的作用域都在最外层,有效地避免了过于深入的嵌套。

    相关文章

      网友评论

          本文标题:iOS Swift基础语法(二)

          本文链接:https://www.haomeiwen.com/subject/feflcxtx.html