美文网首页
每天学一点Swift----可选类型

每天学一点Swift----可选类型

作者: 冯可乐同学 | 来源:发表于2017-05-11 20:07 被阅读23次

    一.可选和nil

    1.在任何类型的后面紧跟?即可表示它是可选类型。可选类型的变量可以用来处理“值缺失”的情况。

    2.先看一个简单的例子:

    var str = "abcdef"

    var num : int = str.toInt();

    由于str转换为Int时有可能会失败,故num可能会没有值,因此不能用Int类型来声明num,应该用可选类型。如下:

    var num : Int? = str.toInt();

    如果str的值是“123”,则会转成功,像这里则会转失败。转换失败时就是值缺失的情况,Swift使用nil来代表“值缺失”的情况。

    3.Swift中的nil与Object-C中的nil是完全不同的。在Object-C中,nil代表一个并不存在的对象的指针。而在Swift中,nil并不代表指针,它是一个确定的值,用于表示“值缺失”,任何类型的值都可以被赋值为nil。

    4.只有可选类型的变量或者常量才能接受nil。其他类型的变量或常量不能接受nil。

    5.如果声明的一个可选类型的变量或者常量没有指定初始值,它将会自动设置为nil。

    举个栗子:var name : String?;

    6.可选类型是Swift中的新特性,C语言和Object-C中没有的。

    二.强制解析

    1. Int类型和Int?类型并不是相同的类型,程序不能直接把Int?类型的变量或常量当成Int类型来使用。

    2.为了获取可选类型的变量或常量中实际存储的值,可在变量和常量后添加英文感叹号!。这种添加感叹号进行解析的用法被称为强制解析(forced unwrapping)。

    3.这个感叹号表示:已知该可选变量有值,请读取其中的值。

    举个栗子:var str : String? = "abcedf"

    var s : String = str----这是错误的。

    var s : String = str!----对可选类型进行强制解析,正确。

    4.需要注意的是:Swift的强制解析是有前提的,即可选类型的变量或常量必须有值时才能解析成功,否则将会导致运行错误。

    因此,在进行强制解析时,建议用if语句判断可选类型是否有值。举个栗子:

    var str : String? = "abcdef"

    if str != nil

    {

    var s = str!

    }else{

    print("str为nil,不能进行强制解析")

    }

    三.可选绑定

    1.可选绑定用于判断可选类型的变量或常量是否有值,如果可选类型的变量或常量有值就赋值给另一个临时变量。可选绑定用在if分支或

    while循环中对可选类型的值进行判断。举个栗子:

    var str : String? = "abcdef"

    if var tmp = str----此处不需要感叹号

    {

    print(tmp)

    }else{

    print("str的值为nil,不能进行解析")

    }

    2.可选绑定支持变量,也支持常量。要使用常量时,将关键字var改为let即可。

    四.隐式可选类型

    1.除了在任意的已有类型后添加?来表示可选类型外,Swift中还可以在任意的已有类型后添加感叹号!来表示可选类型。---可选类型的另一种写法。

    2.比如:Int类型的变量,只能接受Int型的值;

    Int?类型的变量既可以接受Int型的值,也可以接受nil;

    Int!类型的变量既可以接受Int型的值,也可以接受nil。

    3. Int?和Int!类型的区别:当程序要获取可选类型变量的值的时候:对于Int?要进行强制解析时需要加!后缀,而对于Int!则不需要加!后缀,Swift会自动进行隐式解析。

    举个栗子:

    var s1 : String? = "abcdef"

    var s11 = s1!

    var s2 : String! = "abcdef"

    var s22 = s2

    4.在隐式可选类型的变量没有值的情况下,获取该变量的值同样会导致运行时错误,所以也要进行判断。举个栗子:

    var name : String!;

    name = "abcdef"

    if name != nil

    {

    var tmp = name;

    }else

    {

    print("不能进行解析")

    }

    5.需要说明的是,隐式可选类型主要用于定义那些被赋值之后不会重新变为nil的变量。如果一个变量在程序运行期间会重新变为nil,那么应该用普通的可选类型来定义变量。

    五.类型别名

    1. Swift提供了类似C语言中typedef的功能,可以为***已经有的类型***指定一个可读性更强的名字---重命名。

    2. Swift使用typealias来定义类型别名:

    typealias myInt = Int

    typealias myString = String

    var age : myInt = 17;

    var name : myString = "swift"

    3.个人认为:类型别名并无卵用。。。。

    相关文章

      网友评论

          本文标题:每天学一点Swift----可选类型

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