说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
在Swift中没有异常处理或抛出,当你编写库的代码执行了一个失败的子程序,且解析可选类型太麻烦时,你打算怎么做?文章作者所遵循的思想一直是想要保持Swift代码的干净整洁,所以都尽可能的避免对可选类型的使用。

在Swift中没有异常处理或抛出,如果不能像Java一样使用异常控制流结构,那当你编写库的代码执行了一个失败的子程序,且发现解析可选类型(Unwrapping Optionals)太麻烦时,你打算怎么做?我所遵循的一直是想要保持Swift代码的干净整洁,所以都尽可能的避免对可选类型(Optionals)的使用,同时还要维护它们传达错误操作的目的。

最近,Colin Eberhardt指出不抛出异常会让嵌套解析条件(Unwrapping Conditionals)的代码变得杂乱:

if let a = a {  if let b = b {    if let c = c {      println("\(a) - \(b) - \(c)")    } else {      println("Something was nil!")    }  } else {    println("Something was nil!")  }} else {  println("Something was nil!")}

不过似乎有一种替代的方法我们可以尝试:使用闭包形式的回调函数。

在Return语句中使用回调取代可选类型

可选类型会让你的代码变得杂乱,如:

let maybeResult: JSONData? = JSONParser.parse(aJSONString)if let result = maybeResult {    // ...}

调用方需要管理被调用函数功能的结果,它需要知道被调用函数对某些扩展所做的事情。Optionals使用很简单,但你代码中仍会显示解析可选类型留下的复杂的痕迹。

考虑East-Oriented代码的原则:如果一个函数返回一个值,定义信息是向西传播。若它发送的是一个信息时,是向东传播。一个Optional返回值是向西传播信息,而且也正因为它是一个Optional ,较之普通的返回值要更复杂。因为它在一个调用中有两种情况。如果是嵌套调用和嵌套的if语句则会更糟糕。

让我们转移注意力到被调用函数工作的失败部分。

JSONParser.parse(aJSONString) { data: JSONData in    // ...}

现在parse()需要考虑失败处理,只有一切运行顺畅时,它才会进行调用实现成功关闭。反之,调用方不会采取行动。

这足以去执行异步获取和UI更新。如果需要的话,解析器将记录或报告致命的失败地方。
你甚至可以外包加工大量的数据到一个XPC服务,以及从一开始设计异步交互。

如果需要的话,我们甚至可以显式地处理失败部分:

JSONParser.parse(aJSONString, success: {    data: JSONData in    // ...}, failure: {    error: NSError in    NSLog("An error occured while parsing: \(error.description)")})

以NSAsynchronousFetchRequest为例:它有一个完成的代码块,如果请求失败,将不会被调用。Cocoa API也开始越来越多的使用代码块。所以,你可以尝试使用这种方法,也许能够改善你应用的控制流。

文章来源:christiantietze

(编译/刘璐璐 责编/唐小引)

VB 5.0数据库设计技术讲座(4) VB5.0数据库编程经验小集 VB5在处理数据库时的几个“BUG” VB6.0中的几个新增数据库工具 VB处理数据库时求数据表记录总数的最佳方法 VB访问数据库的方案比较 VB数据库编程经验两则 VB数据库编空字段的处理 VB数据库多字段记录的录入 VB数据库记录查询四法 vb应用程序访问sql server方法探讨 VB中超长OLE数据库字段的操纵方法 VB中将数据转换为数据库文件 VB中远程数据库的访问 Visual Basic 的数据库编程 Visual Basic数据库数据的选项录入及选项增减与编辑 把资料输往Excel来列印-VB资料 报表中的滚动问题-VB资料 编写Connect Strings-VB资料 表或查询是否存在-VB资料 不创建DSN直接在程序中使用ODBC数据源-VB资料 不用 DATA 控件操作数据库文件 -VB资料 不用 EOF 以加快记录循环-VB资料 处理Select语句中的单引号 -VB资料 断开所有的数据连接 -VB资料 访问VB外来数据库 非access数据库在vb中的编程及应用 关闭程序中所有创建的数据库连接。 -VB资料 关闭所有的数据连接 -VB资料 关于数据报表的打印设置-VB资料 VB建立、改变及重构Access数据库-VB资料 编写一个函数,通过指针连接两个字符串!!!!!!!!!!!! 用applet怎样打开一个文件吗? 请问哪种ORB产品实现了com服务器/corba客户机的桥 我读《深入探索C++对象模型》的感受,cber能再回答我一次么? 谁有DELPHI的有关网络编程方面的资料?给我一份可以吗? 关于stringgrid的问题????? 痛苦啊,难道要放弃BCB吗? 大家认为在开发过程中是否不能用全局变量? 如何让LINUX支持我显卡 高手,谁来帮我一下~! 取字符 在SDK中,如何获得客户区的宽度和高度呢??(哪两个函数呢?) 哪里有ATL的电子书下载?最好是中文的! 高手谁能帮帮我呀~~~~~~~! 请教:如何在statusbar的panel中显示一个图标呢? VC++中如何使用OLE对象? 初来乍到,发现这儿JJMM还挺多的。。。 请高人指教~! CSDN中碰到这种问题,该如何解决呢? 如何学习director 你能帮我一下吗?~ 企业商务管理软件,开放全部的源代码及开发文档! 企业管理软件,全套源码及开发文档!!!! 哪里有支持任何波特率的通讯控件下载? net_lover(孟子E章)请进~! 一个有关CWebBrowser的问题,急急急!!! 这样的语句为什么不可以实现一次删除多条记录 plmm是什么意思? 各位大侠,知道哪儿有直接可用的上传文件的控件吗? 多谢了!!! 论坛的题目是不是太没意思了 一个sqlserver7统计的问题?? varchar类型不是可以输入255个字符吗,为什么我输了160个就出现'item XXX doesn't pass validation test ' 唉 ~~~~~ 奈何 ~~~~~ 突然想到个荒唐的问题: 事件和过程有什么不同? 奇怪的事前,高手请进来 我的问题还没有解决~! 这里的高手呢,人听多,会的人不多 申奥倒计时,如果你在线,请进来验证这以历史性时刻,谢谢 我有一个用hook截获鼠标移动的dll,但是没有效果,请问怎么调试? 请教,怎样在java中把Button的背景改做一个图片 对delphi5一个自带例题的疑问。 爆炒MM之水园MM ID一览 窗体和控件的自适应问题? 求《unix》环境高级编程的源程序下载。 在MIS或WEB中有大量的对数据操作的工作,是否所有的insert,update,delete工作都需lock and unlock??? 紧急求助:那里有pb7的最新版本下载(mark200106@sina.com) 感谢stanely :) 哪里有《unix环境高级编程》所带的源程序下载? 关于quickrep得统计问题,为什么我只能把所有的数据累加而不能累加一个grouphead和groupfoot之间的数据 关于ATL做ActiveX控件的问题 关于jc文件的问题 递等式 5乘777加13乘555怎么巧算、、麻烦帮我一步一步写出来. 已知a是第三象限角,且sin^4a+cos^a=5/9,那么sin2a等于?最好过程能说得通俗些,因为我懂得还不是很多. 已知角α的终边上有一点的坐标是P(3a,4a),其中a≠0,求α的三角函数值 计算(-1)+(-3)+(-5)+(7)+…… +(-99) 已知a是第二象限角,且sin^4a+cos^4a=5/9,那么sin2a等于 已知角a的中终边上有一点坐标p(3a,4a) a不等于0 求sina cosa tana 的三角函数如题 考试中 如何计算1+3+5+7+.+99=?里面有多少项?如何计算呢?===多少? 已知a是第三象限角.若sin^4+cos^4=9分之五5 求sin2a 设a<0,角阿尔法的终边经过点P(-3a,4a),那么sin阿尔法+2cos阿尔法的值等于 怎样求证对于任意的角A cosA四次方-sinA的四次方=cos2A 已知a是锐角且cos^4a-sin^4a=3/5,求sin2a(2)(sin^2a+3sinacosa-cos^2a)/(2sin^2a+cos^2a)的值 已知角α的终边经过点P(4a,-3a)(a≠0),求2sinα+cosα的值? 已知cos2a=3/5,求sina的四次方+cosa的四次方 已知a是第三象限角,sin∧4a+cos∧4=5/9那么sin2a等于 设角α的终边上有一点P(-4a,3a)(a≠0),则2sinα+cosα的值是( ) 怎么求? cosa四次方—sina四次方 为什么 等于cos2a 若sina+sin^2a=1,求cos^2a+cos^4a的和 已知角a的终边上有一点P(3a,4a) (a sin^4a+cos^4a=1,则sina-cosa= 已知sina+cosa=1/2 求:sin^4a+cos^4a 设α角终边过点p(3a,4a)(a≠0)求sinα,cosα,tanα? 求证:(1-cosa的4次方-sina的4次方)/(1-cosa的6次方-sina的6次方)=2/311 已知sina+sin^2a=1,求3cos^2a+cos^4a-2sina+1 设α角终边过点p(3a,4a)(a≠0)求sinα,cosα,tanα? 用cosa 表示sin4a-sin2a+cos2a 若cosA+cos^2a=1,则sin^2A+sin^6A+sin^8A等于多少若cosA+cos^2A=1,则sin^2A+sin^6A+sin^8A等于多少 上面那个题打错字母了 已知角B的终边过点P(-4a,3a)Simb.cos b.tan b谁知道怎么整啊 sin4a-cos4a=sin2a-cos2a 求证 已知cosa+cos^2=1,则sin^2a+sin^6a+sin^8a=多少请给出详解,谢谢! sin²a+cosˇ4a+sin²acos²a 化简 (sin2a-cos2a)^2=1-sin4a 求证! 已知sina+cosa=m 求sina*cosa 和 sin^4a+cos^4a的值 2.证明:sin²²a+cos²²a=1-2sin²acos²a 22是4噢2.证明:sin²²a+cos²²a=1-2sin²acos²a 22是4噢 打不出这个符号 (sin2a-cos2a)^2=1-sin4a请尽快给我答案!急!急!急! 若sin^4a+cos^4a=1,则sina+cosa= 求证[1]1-2sin acos a/cos²a -sin²a =1-tan a/1+tan a.[2]1-cos 2θ/1+cos 2θ=tan²θ 证明题:(sin2a-cos2a)²=1-sin4a 已知sina+cosa=1/3,求sin^a+cos^4a sin∨4a-cos∨4a=sin²a-cos²a 求证 sin4a+sin2a*cos2a+cos2a=? 求过程,谢谢!sin4a数字是次方 cosa=1/2,cos^4a+sin^4a=?cos2a=1/2 证明:sinα^2+sinβ^2-sinα^2sinβ^2+cosα^2cosβ^2=1 1.25*7.1+1/8*2.6+0.375的简便算法 求所有的实数a,使得cosA,cos2A,cos4A,…,cos2^nA都是负数.n∈N,实数a就是角A。 已知sina·cosa=1/2,求sin^4a=cos^4a的值打错了求sin^4a+cos^4a 1.25*1.6*1.5简便算法 sin a +cos a =1/2 0 已知sina+cosa=p,求(1)sina*cosa(2)sin^2a-cos^2a(3)sin^3a+-cos^3a(4)sin^4a+-ctg^3a 1+2-3-4+5+6-8+9···+1997+1998-1999数一个没错,让你计算, cos(a+b)=3/5 sin(b-pai/4)=5/13 a,b 属于(0,pai/2) 求cos(a+pai/4) 三角函数sin、cos、tan各等于什么边比什么边? 333*333怎样用简便方法计算? 若0 我要sin.cos.tan三角函数表,只要30°45°60°.是要根号的,不要有小数点的 333乘以333用简便方法怎么算 已知π/2 三角函数问题 sin与cos和tan怎么转换比如sin150度,为什么等于sin30度,cos150度为什么等于-cos30度 777+777-777x777÷777=?用递等式怎么计算 已知cos2a3/5求cos^2a sin^4a的值 已知角阿尔法的终边上有一点p的坐标是(3a,4A),其中a不等于0,求三角函数值.这道题为什么先求半径 不是求函数值都是按单位圆半径为1算的吗?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn