zoukankan      html  css  js  c++  java
  • Swift

    可选类型详解

    直接上代码解释

    // 类中所有的属性在对象初始化时,必须有初始化值
    class Person : NSObject {
        var name : String?
        var view : UIView?
        var age : String?
    }
    
    // 1.定义可选类型
    // 1>普通定义可选类型的方式
    var name : Optional<String>
    // 2>语法糖 //这样写默认为空
    var name : String?
    
    // 2.给可选类型赋值
    name = "why"
    
    // 3.从可选类型中取值
    print(name)  // Optional("why")
    // 从可选类型中取值:可选类型!-->强制解包
    //print(name!)
    
    
    // 4.注意:如果可选类型中没有值,那么强制解包程序会崩溃
    // 强制解包是非常危险的操作:建议在解包前先判断可选类型中是否有值
    if name != nil {
        print(name!)
        print(name!)
        print(name!)
    }

    "?" 这个简单意思,你的变量可能为nil,或者你可能将nil赋值给它,需要给变量定义的时候加上"?",否则一旦你将nil赋值给没有加"?"的变量,编译就会报错
    举个例子理解一下,我们假如有一个盒子,盒子是一个存在的物体,swift不允许有空值出现,那我们怎么办呢?就需要把空值装到一个盒子里面,系统检查的时候,发现有一个盒子,哦,好的,检测通过,但是如果你把盒子打开系统就会报错

    打印name 输出

    Optional("why")

     发现有个Optional 就说明这个变量被包着,那么怎么才能不让它包裹着呢? 很简单, 给变量加一个"!"

    print(name!) //输出 why

    我们还有一种解包的方式

    let nickName: String? = nil
    let fullName: String = "XUJIE"
    let name = nickName ?? fullName  //如果第一个解包值发现为nil,则使用第二值
    print(name)

    ?? 的使用还有一个注意点

    先看下面的例子

    let a:Int! = 3
    let b = 4
     // 如果a不为nil则对a进行解包,赋值将b的值付给c
    let c = a != nil ? a! : b
    //??的用法相当于上面
    let c = a ?? b // 如果a为nil则使用b的值替换a的值,如果a不为nil,则对a解包然后将值付给b

    再看一个例子

    let a:Int??? = 3
    let b = 4
    let c = a ?? b // 分析对a进行一次解包,得到的值不为nil,所以把解包后的值付给c
    print(a)
    print(c)

    运行结果:

    Optional(Optional(Optional(3)))
    Optional(Optional(3))

     再看一个例子(问题来了哦)

    let a:Int??? = nil
    let b = 4
    let c = a ?? b
    print(a)
    print(c)

    有些人已经猜到答案 nil  4  但我告诉你答案不是这样的,先来分析一下

    首先a,有三个包Optional(Optional(Optional(nil))),当我们解掉第一次包后,发现值为nil,此时,我们需要将b的值替换给a,Optional(Optional(4))

    所以我们的最终显示结果为:

    nil
    Optional(Optional(4))

    可选绑定(判断可选类型中是否有值)

    let urlString = "http://www.520it.com"
    let url : URL? = URL(string: urlString)
    
    // 1.普通写法
    if url != nil {
        let request = URLRequest(url: url! )
    }
    
    // 可选绑定
    if let url = url {
        let request = URLRequest(url: url)
    }
    
    // 可选绑定的简介写法
    if let url = URL(string: urlString) {
        let request = NSURLRequest(url: url)
    }
  • 相关阅读:
    PHPExcel常用方法总结
    ThinkPHP多语言在分组下的用法!
    derby 的字符集
    最小化msn,skype到右下角(Win 7)
    用javascript控制 youtube动画,直接打开html会失败
    maven 的本地仓库
    excel读取csv的字符集问题
    在dos控制台显示utf8字符
    关于在php和mysql中日期型date,datetime,timestamp的使用
    用 java jar执行时的classpath的问题
  • 原文地址:https://www.cnblogs.com/junhuawang/p/6244944.html
Copyright © 2011-2022 走看看