前端之家收集整理的这篇文章主要介绍了
Swift 学习之二十一:?和 !(详解),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,
也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化
。如果在使用变量之前不进行初始化就会报错:
- varstringValue:String
- //error:variable'stringValue'usedbeforebeinginitialized
- //lethashValue=stringValue.hashValue
- //^
- lethashValue=stringValue.hashValue
出错的原因就是在使用stringValue这个变量之前,没有初始化这个变量,也就是这个变量根本就没有得到内存,
这时就会出错。
那么我们可以使用optional类型,后面跟一个?就是了。
文档中有提到说,在使用Optional值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个
?
,如果是nil值(不存在值),也就是
Optional.None
,会跳过后面的操作不执行,如果有值,就是
Optional.Some
可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,来保证执行这个操作的安全性,比如Optional binding:
在写协议(protocol)时,对于可选代理方法,也需要在调用时在函数名后跟着?,如:
copy
//@objc是用于处理Swift与OC之间的转换的,由于@optional是OC中的关键字,
//所以在protocol之前需要添加上@objc。
@objcprotocolHttpRequestDelegate{
//@optional说明这个代理方法是可选方法,
//那么在调用的时候,需要这样调用:delegate?.requestFinished?(self,downloadData)
//其中delegate?是因为delegate也是optional的
@optionalfuncrequestFinished(request:HttpRequest!,downloadData:NSMutableData!)
//otherfuncs...
}
vardelegate:HttpRequestDelegate?
vardownloadData=NSMutableData()
delegate.requestFinished(self,downloadData)