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

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

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

SDCC 2013:阿里周宝方谈“去IOE”战略及实施 百度和高德:最后谁是地图的王者? 【CTO论道】瑞智和康CEO陶建辉:软硬结合是消费电子新潮流 10大高效率原型设计工具 JIRA与敏捷:李小龙教给我们的敏捷开发之道 百度开放云:Light Up The World,与开发者共享云未来 有胆你就来!11个在线编码大赛 CTO如何避免决策失控:第一步-定义角色 后机械硬盘时代,那些引领风骚的闪存初创公司 致远文杰:传统企业如何实现移动化转型? 记华为HCC2013 Day2:SDN开放编程系统OPS打造生态圈 HCC2013:华为FusionCube融合至简,性能至优 已确认Stephen Elop候选微软下任CEO 英语对于软件开发者来说到底有多重要? SDCC 2013中国软件开发者大会成功落幕 新浪微博宋琦:PHP在微博优化中的“大显身手” 8月份浏览器份额:IE浏览器PC端出现反弹 移动端跌出前五 如何让Ruby项目速度提升10倍 跨平台进行到底:Facebook发布Unity SDK 云薪资管理初创公司ZenPayroll:年处理薪资超1亿美元,获多位知名CEO力挺 Twitter开源Summingbird:近原生编码下整合批处理与流处理 亚马逊推Matchbook 欲将顽固纸质书读者拉向电子书 Broadcom为可穿戴设备推新开发平台WICED 再战江湖 New Kodak还牛不牛? 郭理靖:公、私有云架构异同点与难点 美化代码的15个代码语法高亮工具 你所不知道的虚拟化和云计算 [开源推荐]Effeckt.css项目:CSS交互动画应用集锦 针对Google Glass应用的四大UX设计原则及典型应用 Google收了摩托罗拉,微软收了诺记,黑莓又将花落谁家? 十亿月PV网站秘诀:Reddit自失败中总结的25条经验 程序是中文的,可以在日文的 WINDOWS 98 上正常显示 , 及运行吗 ? 有没有用过zope的大侠,谈谈感受吧:D LNK4089是什么原因引起的? ADO中,如何获得连接字符串? 请问关于OO的设计问题之二? 语句的错误? 换个id灌水的感觉真爽 一个最简单的存储过程 关于空间的问题 资源文件是什麽,怎麽使用? 请问怎样将下拉数据窗口中的某一行设置为当前所显示的行? InstallShield 如何做个 unistall 的 shortcut 到菜单里 scandir怎么用? 怎样从CMainFrame中调用DOCUMENT类中的PUBLIC成员!谢谢! 在线成中如何更新一个对话框 学习JAVA用JSDK开发还是VJ++?有什么区别吗?还是一样? "Resource id #1"是什么意思?? 主板上风扇都不转了,是什么原因??请教,谢谢!!! 乒乓球队进行比赛.... WIN98中公用文件夹窗体中文本框不能显示汉字 请问大虾:MDI窗体的菜单能不能和子窗体的菜单一起显示在菜单栏上??? 再谈关于PB控制Excel的问题。。。(ton2000) COM连接点客户端接受器的实现问题 为什么我的安装包不能安装?请高手指教,急啊。 送分问题:ASP字符串处理的函数有哪些? VB中将数据库中单条记录输出并打印! VB中如何宣告在DLL文件中的函数? 如何在正则表达式中加入变量 delphi 中的table 的filter有没有支持 like方法,该怎么用,同时filter当字段值为中文时怎么写? 主板上所有的风扇都不转了,硬盘和cpu都能正常工作,请教,谢谢!! 如何判别文件是不是文本文件? 新换了一块20G的硬盘,准备拿出10G安装Redhat7.2,请教最佳的分区方案? 关于武大华软 基于EJB的三层架构下的报表解决方案讨论...... 请问如何保存一个网站的资源 大学本科,,函授,自考,夜大,远程教育,自学!哪个硬! 比比! 斑竹到哪里去了???为什么我问的问题都没人解答的????斑竹职责何在??参与有分 基于EJB的三层架构下的报表解决方案讨论...... 哪位大侠可以给我解释一下“函数重载”是什么??请具体一些!! COM连接点客户端接受器的实现问题 用SQL SERVER中的imprort and export data 将paradox的数据库转为SQL SERVER数据库,可当数据库有密码时,如何转换? 请问java的xml解释器有哪些?怎么能在applet里用这些解释器? 一个小问题!有分哦 关于DBgrid的操作? 一个关于header的问题 一个小问题!有分哦 基于EJB的三层架构下的报表解决方案讨论...... 我这个LoadCursor为何不听话 jsp连接数据库(Access)的问题 局域网中为什么网上邻居里只能找到自己,别人找不到我的计算机,我也看不见别人的? LoadImageA()函数的参数的说明 我的世界 这是什么怪?在主世界的末地传送门附近有一个铁还是木门里看到的,还有很多怪 世界上最无聊的事情是什么 自来水功能和纯净水功能是什么意思?我按纯净水谁说我的水箱里的水是纯净水还是说把自来水过滤成纯净水? 如何同时检验碳酸根离子和氢氧根离子?rt对不起我没说明白 我想知道 他俩共存时 为什么一定要先检验 碳酸根离子? 利用海水得到淡水可采用的办法是A沉淀法 B过滤法 C蒸馏法 沉淀 过滤 吸附 蒸馏 这些方法净水程度净水程度从大到小排列 世界上有没有怪兽? 世界上第一大河是什么河? 偏铝酸根与酸的反应有水参加吗? 世界上存在怪兽吗? 偏铝酸根和氢氧根反应不? 偏铝酸根离子能和碱反应吗举例说明下 世界上什么东西最硬 世界上什么河最危险?为什么呢? 请问氢氧化铝加碱成偏铝酸根的反应原理讲得深点 中和反应是指酸碱反应吗?那酸和碱性氧化物的反应叫中和反应吗?有盐和水生成的反应一定是中和反应 这句话对吗? 某溶液只含以下离子中的五种,且各种离子物质的亮均为1mol 钠 镁 亚铁 铁 铝 氢氧根 碳酸根 氯离子 硝酸根硫酸根以下为条件1:若向溶液中加入硫氰化钾,溶液无明显变化2:若向原溶液中加 为什么水蒸气蒸馏温度永远低于100度 锂碘电池,电解质固体碘化锂,导电离子碘,为何锂做负极,碘作正极? 两性氧化物和酸和碱分别只生成一种盐和水吗因为定义只说既可以与酸反应生成盐和水又可以与碱反应生成盐和水的氧化物称为两性氧化物,还有一定要强酸、强碱才可以吗 世界上最大河流在哪里 细胞中的水具有运输作用,那它算是载体吗?高一生物必修一36页第二题求详解水在生物体的许多化学反应中充当:()A 溶剂 B 催化剂C 载体 D 还原剂为什么C不对? 能与酸和碱反应生成盐和水的氧化物 偏铝酸根可以看做弱酸根,那为什么不能和氢氧根反应? 老师,人教版高一生物必修2的89页练习基础题1(1)体细胞中含有两个染色体组的个体就是二倍体.看了您的解释有点迷惑! 盐酸和碱性氧化物反应的生成物是什么?A、碱和水 B.盐和水 C、金属和水 D、 酸和水 世界上什么河最大往印度哪儿想 电暖宝里面的液体是什么? 蒸发和蒸馏那一个主要是从溶解性的角度来考虑的? 关于偏铝酸根和镁离子.铁离子的方程式 电暖宝里的液体是什么东西?电暖宝知道是什么吧.就是那种用电加热的暖水带.我一不小心把里面的液体弄出来了,黄黄的液体,这个对人体有害吗?是什么东西 1.氢氧根离子 硫酸根离子 硝酸根离子 碳酸根离子 符号怎么演变,根据8电子稳定结构原理?2.为什么氢氧根离1.氢氧根离子 硫酸根离子 硝酸根离子 碳酸根离子 符号怎么演变,根据8电子稳定结 钠离子,偏铝酸根离子,碳酸根离子,氢氧根离子,向溶液中滴加盐酸,现象顺序是? 蒸馏需要用到什么, 氯酸根 ClO3- 硝酸根 NO3- 碳酸根CO32- 铵根 NH4+ 它们的离子符号是怎么确定的? 世界上最常的河流是那条? 实验室蒸馏操作中要用到的仪器 知道的有铁架台 铁圈 酒精灯 承接管 锥形瓶 再写出四种 世界上最硬最好的刀是什么 对于①静置、②吸附、③过滤、④蒸馏等净化水的操作,单一操作相对净化效果由高到低的是什么、、 蒸馏易燃液体可用什么蒸馏 实验室!蒸馏用的八个仪器是什么? 在水的净化中,静置、吸附、过滤、蒸馏各起到了哪些效果? 怎样证明铝化铝是共价化合物不好意思,是氯化铝 酸和碱发生中和反应生成盐和水例如H2SO4+CA(OH0)2 怎么快速记忆常见元素的化合价和原子团的化合价? 溶解操作中必须用到的玻璃仪器有什么和什么 世界上最幸运的事是什么 世界上什么东西跑的最快? 做过滤实验中缺少的玻璃仪器是什么.用到的玻璃仪器有什么 用一种溶液检验氯离子、碳酸根离子、氢氧根离子 世界上什么鸡跑的最快 在溶解,过滤,蒸发操作中,全都用到的玻璃仪器是什么 世界太多的事是靠幸运!很多天王巨星都是被星探发掘,然后就成了明星.同样的人别人累生累死三餐都成问题.为什么,他她有天份!为什么他她有天份别人没有,因为他她比别人幸运.成为明星他 世界上什么跑得最快 过滤用到的玻璃仪器 某溶液中含有大量氯离子,碳酸根离子,氢氧根离离子,如果只取一次该溶液就能检验全部离子下列循序正确的是1,+硝酸镁 2.过滤 3.加硝酸银 4.加硝酸钡 A.12423 B.42123 C.12324 D.42321 给出答案的请说 世界上什么跑的最快? 碳酸根、氯离子、氢氧根 怎样分别检验 世界上最神奇的事情是什么? 供水公司净水加氯时, 在氯钢瓶外壳淋水的作用是:
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘