刚从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>


例子:这里showSuccessAlert返回的是一个option值,若非nil,着执行if中代码块
<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项目里的"?!"的更多相关文章

  1. HTML5 移动页面自适应手机屏幕四类方法总结

    这篇文章主要介绍了HTML5 移动页面自适应手机屏幕四类方法总结,非常具有实用价值,需要的朋友可以参考下

  2. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  3. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  4. ios – NSJSONSerialization崩溃的应用程序

    我有一本字典,当我记录它时显示…我正试图将它变成NSData,用于像这样的JSONWeb服务……但每次我运行它时,应用程序都会崩溃.字典正确形成,应用程序只是崩溃在这一行.在AppCode中,我收到崩溃报告……在Xcode中,应用程序停止,如果我尝试继续,它会因错误而停止…

  5. xcode – 错误“线程1:断点2.1”

    我正在研究RESTAPI管理器.这是一个错误,我无法解决它.我得到的错误在下面突出显示.当我打电话给这个班级获取资源时:我评论的线打印:Thread1:breakpoint2.1我需要修复错误的建议.任何建议都非常感谢解决方法您可能在不注意的情况下意外设置了断点.单击并拖动代表断路器外部断点的蓝色刻度线以将其擦除.

  6. ios – Apple Watch,WatchKit Extension和主要应用程序

    有逻辑的主要应用程序,我们将应用程序扩展到AppleWatch.添加目标xCode后,再创建2个应用程序:扩展代码和监视工具包应用程序.问题:扩展程序中的代码如何重用已准备好的主要iOS应用程序的逻辑?

  7. ios – 如果Element符合给定的协议,则扩展阵列以符合协议

    如果是这样,语法是什么?解决方法Swift4.2在Swift4.2中,我能够使用符合这样的协议的元素扩展数组:

  8. 通过AFNetworking 2.0上传iOS图像

    我一直在寻找新的AFNetworking2.0上传图像的例子.但是我正在撞墙,无法弄清楚代码有什么问题.所以这是我使用的代码TIA解决方法我最终使用了多部分请求

  9. ios – 使用drawInRect时如何设置文本颜色?

    我一直在使用PaintCode在我的应用程序中绘制一些图形,一些绘制的元素具有使用“drawInRect”绘制的文本.无论我做什么尝试并设置颜色,文本总是显示为黑色.这是创建文本的代码,我试图设置颜色:“文本绘图”中的白色是不能正常工作的.谢谢你的帮助.解决方法您需要通过以下方式设置传入的“属性”字典中文本的颜色:我的建议是:

  10. xcode – 尝试在Pin上居中地图(MKMapView)

    苦苦寻找一种方法来使地图缩放并以注释引脚为中心.Pin下降,但地图加载海洋.代码如下.第2个问题,非常相关:在实现上述问题的答案后,我已经修改了我的代码.现在,我的坐标从前一个视图到我的MKMapView,所以我不必费心去做两次API调用,第二个是在MKMapView中.目前在我的ViewWillAppear中,我有以下内容,并且AGAIN遇到了一个问题,即视图不会居中并放大图钉:反馈非常感谢,因为我不知道还应该做些什么.引脚加载到正确的坐标上,只是没有居中/缩放…

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部