Swift中的!和?
2015-07-11 23:00
288 查看
转自:http://segmentfault.com/a/1190000000533936
一般我们在一下两种情况下会遇到!和?的使用
1.声明变量时
2.在对变量操作时
由于这两种情况的意义不同,所以分开进行解释:
1.声明变量时
在声明一个变量时如果不手动初始化,Swift不会自动初始化该变量为一个默认值的。
但是对于Optional的变量则不同,Optional的变量在声明时如果不初始化,Swift会自动将该变量初始化为nil。声明变量时在类型后添加?或者!就是告诉编译器这个一个Optional的变量,如果没有初始化,你就将其初始化为nil
但是这两者之间还是有一些区别的,介绍后面之后再讲。
Optional事实上是一个枚举类型,从下图可以看出,Optional包含None和Some两种类型,而nil就是Optional.None,非nil就是Optional.some。如果Optional变量在声明时不初始化,Swift会调用init()来初始化变量为nil,而用非nil的值初始化变量时,会通过Some(T)把该原始值包装,所以在之后使用的时候我们需要通过解包取出原始值才能使用。
2.对变量进行操作时
这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。
这里的叹号和之前的问号则不同,这里表示我确定dataList一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让dataList为nil,程序就会crash掉。
回到上面声明时?和!区别的问题上去
声明变量时的?只是单纯的告诉Swift这是Optional的,如果没有初始化就默认为nil,而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。
总结
问号?
a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
叹号!
a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理
一般我们在一下两种情况下会遇到!和?的使用
1.声明变量时
var number :Int? var str : String!
2.在对变量操作时
number?.hashValue str!.hashValue
由于这两种情况的意义不同,所以分开进行解释:
1.声明变量时
在声明一个变量时如果不手动初始化,Swift不会自动初始化该变量为一个默认值的。
var a : String var b = a //error:因为没有初始化a,a没有值
但是对于Optional的变量则不同,Optional的变量在声明时如果不初始化,Swift会自动将该变量初始化为nil。声明变量时在类型后添加?或者!就是告诉编译器这个一个Optional的变量,如果没有初始化,你就将其初始化为nil
var a : String? //a 为nil var b : String! //b 为nil var a_test = a //a_test为nil var b_test = b //b_test为nil
但是这两者之间还是有一些区别的,介绍后面之后再讲。
Optional事实上是一个枚举类型,从下图可以看出,Optional包含None和Some两种类型,而nil就是Optional.None,非nil就是Optional.some。如果Optional变量在声明时不初始化,Swift会调用init()来初始化变量为nil,而用非nil的值初始化变量时,会通过Some(T)把该原始值包装,所以在之后使用的时候我们需要通过解包取出原始值才能使用。
2.对变量进行操作时
var arrayCount = dataList?.count
这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。
var arrayCount = dataList!.count
这里的叹号和之前的问号则不同,这里表示我确定dataList一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让dataList为nil,程序就会crash掉。
回到上面声明时?和!区别的问题上去
声明变量时的?只是单纯的告诉Swift这是Optional的,如果没有初始化就默认为nil,而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。
总结
问号?
a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
叹号!
a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理
相关文章推荐
- 属性观察_Swift
- Swift结构体和类
- swift 拼图小游戏
- iSwifting社区【www.iSwifting.com】招聘版主
- SWIFT中切換UIContainerView內的Controller
- swift错误: Type "xxx" does not confirm to protocol "BooleanType"
- SWIFT中正则表达式验证邮箱
- Swift语言 OS X程序点击dock图标重新弹出窗口方法
- Swift之使用UIAlertController实现UIActionsheet
- Swift开发--Storyboard的使用教程
- swift 动态设置UILabel的高度
- Swift入坑--单例
- Swift入坑--@selector
- Swift面向协议编程
- Swift-ReactiveCocoa3.0(一)Signal
- Swift与Cocoa框架开发
- swift单例
- Swift之文件管理
- Swift之泛型类型与泛型参数
- swift 笔记 (七) —— 关闭