浅谈Swift2.0对optional value的安全处理,慎用问号叹号"?!",消除swift项目里的"?!"
来源:互联网 发布:mac可以玩童话吗 编辑:程序博客网 时间:2024/06/02 02:24
刚从oc转过来swift的朋友应该会感觉到swift中optional类型的粘人,是的,使用swift后就跟optional value撇不清关系了,刚上来的代码可能会是?!满天飞,这些?!肯定是要花功夫心思解决的。
swift要求编码者时时刻刻都对optional变量保持安全性思考,考虑该optional值会否为空(nil),若为空会不会带来影响,当然,不注意optional变量的安全使用,会很大概率为程序带来许多意料之外的问题,甚至crash。
容忍optional value不必要的" ?!"带来的害处:
容忍"?":在optional变量在传递过程中,不对其进行解包而保留"?",当真正使用该optional变量时,若其值为nil,则业务信息得不到传递,失去了业务的实现,也得不到对这种情况的处理。
容忍"!":而使用"!"对optional值进行强制解包的前提是编码者非常确定该optional值在该情况下不会为空(nil),对其强制解包成为非optional值使用,而过多不必要的"!"存在,相当于养着许多crash隐患,万一强解一个为nil的optional值,就有一次crash的可能。
综上,我们需要通过安全的手段去消除这些不必要的“ ?!”
conditional binding
guard
用例子来说话吧:
例子:conditional binding,value为optional value,使用confitional binding后若value为nil,if代码块不执行,若value非nil,我们得到的nonNilValue(非optional)为value真正的内容,也就是说我们现在使用的value(nonNilValue)在使用时不需要注明"?"或者"!"
<span style="font-size:14px;">for key in allKeys { let value = parameterDictionary.objectForKey(key) as? String if let nonNilValue = value { }}</span>
例子:guard,上面例子是针对某代码块中因不同情况而决定是否需要执行的代码块处理,而针对发生某种情况,则跳过整个方法的处理如下:
<span style="font-size:14px;">static private func addTimestampAndSign(dict: NSDictionary?) -> NSDictionary { guard dict != nil else { return [:] } //do something }</span>若dict为nil,执行guard代码块return一个空字典, dict非nil(符合期望), do something --------多个条件语句使用"&&" 分隔
例子:guard let, data为optional value ,若data为nil,执行guard代码块(return nil),若data为有效值,则赋值给nonNilData(非optional value),继续执行且nonNilData不再需要" ?!"
<span style="font-size:14px;">class private func dataToDictionary(data: NSData?) -> NSDictionary? { guard let nonNilData = data else { return nil } var resultDict: NSDictionary? do { resultDict = try NSJSONSerialization.JSONObjectWithData(nonNilData, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary } catch { debugPrint("JSONObjectWithDataError: \(error)") } return resultDict}</span>
--------多个guard let语句使用逗号分隔: guard let nonNilName = name, let nonNilPassword = password else { }
例子:if let 还可以用来判断类型转换是否成功返回有效值(非nil)
<span style="font-size:14px;">if let goodsList = dataList.objectForKey("goods_list") as? NSArray {}</span>
<span style="font-size:14px;">if let validateAlert = ValidateAlertView.showSuccessAlert(self, status: true, dataList: dataList) { }</span>
转载请注明出处: http://zyden.vicp.cc/swift-optional-value/ 谢谢
- 浅谈Swift2.0对optional value的安全处理,慎用问号叹号"?!",消除swift项目里的"?!"
- swift问号,叹号的理解
- swift 问号和叹号的理解
- swift 中问号和叹号的区别
- [swift]问号和叹号的区别
- swift ? 问号 和 !叹号 操作符的作用
- swift3.0 问号和叹号的理解
- swift3.0 unexpectedly found nil while unwrapping an Optional value的解释 && Swift中Optional
- Xcode中针对警告(黄色叹号)的忽略消除处理
- ruby 中叹号问号的作用
- unexpectedly found nil while unwrapping an Optional value的解释 && Swift中Optional
- Swift的Optional类型
- 深入浅出Swift的Optional ?!
- Swift的optional
- Swift的Optional、Array
- Swift的Optional
- Swift Optional Type(问号?和感叹号!)的理解和使用
- utf8转gbk出现问号的分析,浅谈perl对二进制的处理
- 华为机试——字符子串比较
- 毕业生自传-12(转战橡皮果)
- Jenkins自动构建的方法
- SpringMVC4 配置
- OpenGL 中常用的 GLUT 函数库 【转】
- 浅谈Swift2.0对optional value的安全处理,慎用问号叹号"?!",消除swift项目里的"?!"
- Xcode插件管理,以及失效解决办法
- instancetype和id关键字
- java中float内存存储原理
- I帧,P帧,B帧简介
- 兔子-更改 Apache 默认网站根目录
- UIView常见属性(一)
- 爬虫-libxm2安装
- (LOG)Laplacian of Guassian & (DOH)Determinant of Hessian 斑点检测