zoukankan      html  css  js  c++  java
  • Swift-'!','?'用法

    ///'!','?','as'的用法
    
    ///'!'与'?'用法与可选类型(Optional)
    
    ///首先要了解Optional类型包括什么,
    
    ///Optional类型的值包括: 1.nil 2.值
    
    ///声明Optional类型变量如: var arr : NSMutableArray?(整个NSMutableArray?是一个类型叫可选类型),与之对应的是:
    
    ///var arr : NSMutableArray(非可选类型)
    
    ///区别在于1.非可选类型,声明后想使用必须赋值,否则变量无值,使用系统报错2.可选类型,声明后默认当没有值的时候就会给一个nil值,使用系统不会报错.
    
    ///Optional类型和非Optional类型
    
    /*可选型数组,声明就有nil值*/

    /*可选类型其实 是一个枚举类型*/

      enum Optional : NilLiteralConvertible {

             case None

             case Some(T)

     }

     /*全写Optional类型变量*/

     var arr: Optional<NSMutableArray> = nil 

     var arr: NSMutableArray?

    
    /*不可选数组,声明必须赋值不赋值,否则无法使用*/
    
    vararr1 :NSMutableArray
    
    //打印在不赋值的情况下为nil
    
    DEBUGLOG("可选数组Arr:(arr)")
    
    //打印在不赋值的情况下系统报错
    
    //DEBUGLOG("不可选数组(arr1)")
    
    ///'!','?'放在变量后
    
    //打印的时候有两种一个是'!'一个是'?'分别代表着什么呢?
    
    //用'!'强制拆包把原来可选(Optional)数组的非nil值取出来,当可选数组arr通过强制拆包没有非nil值的时候,运行时系统就会抛出错误.
    
    //用'?'来取arr里面的可选类型值,当arr没有值的时候,可选类型会返回一个nil值来供我们使用
    
    /*编译器抛出错误unexpectedly found nil while unwrapping an Optional value*/
    
    //DEBUGLOG(arr![0])
    
    /*正常运行*/
    
    DEBUGLOG(arr?[0])
    
    ///中间有个小插曲演示一下,这个时候我给可选数组(Optional)赋值了一个空数组,再次打印arr?[0]
    
    /*因为可选数组已经有有值了是一个空数组[],我们arr?并不是像上面那样判断了arr初始是否为空,为空赋值nil,不为空取值.而是因为arr?判断数组确实有值,值为[](空数组),取出空数组,所以提示数组越界*/
    
    arr = []
    
    /*这个时候系统抛出一个错误: -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array*/
    
    //DEBUGLOG(arr?[0])
    
    ///可选变量的值可以当作if的条件语句,有值为真,否则为假
    
    ifletvalue = arr {
    
    DEBUGLOG("有值(value)")
    
    }else{
    
    DEBUGLOG("无值")
    
    }
    
    ///总结:在使用Optional变量的时候,我们一般如下操作:
    
    ///1.当需要使用Optional变量的值的时候,我们对Optional变量'.!'来强制拆包取非nil值,当然,如果Optional没有非nil值,会crash.
    
    ///2.当需要使用Optional变量的方法的时候,我们对Optional变量'.?'来进行取值,如果有值返回值,无值返回nil.
    
    ///3.可选变量的值可以当作if的条件语句,有值为真,否则为假
  • 相关阅读:
    build.gradle文件详解<转> 推荐
    openGL 环境配置
    手写 大整数
    FOJ有奖月赛-2016年8月(daxia专场之过四题方有奖)
    2.1 基本计数方法
    第7章 代码
    第7章 高级数据结构的编程实验
    3.3 字符串(1)
    2016_NENU_CS_3
    3.2 区间信息的维护与查询
  • 原文地址:https://www.cnblogs.com/shenyangxiaohuo/p/5315221.html
Copyright © 2011-2022 走看看