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的条件语句,有值为真,否则为假

 

posted @ 2016-03-24 13:50  我大沈阳无敌  阅读(1163)  评论(0编辑  收藏  举报