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

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

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

基于ActiveMQ的消息中间件系统 OneMM逻辑与物理架构设计详解 John Carmack大神亲操刀,为Oculus开发Netflix应用 React Native实战(二):Android的打包 独立游戏的成功秘诀:好设计才是王道 Swift 2.1的新变化 Apple TV实战:用TVML开发第一款tvOS应用 【SDCC讲师专访】阿里王晶昱:云时代的分布式数据库DRDS 硬件研发、嵌入式技术演进:MDCC IoT峰会日程揭晓 专访百度知道iOS团队负责人孙源:代码强迫症的死实践派 TIOBE 2015年10月编程语言排行榜:Ruby取代Objective-C进前十 【SDCC讲师专访】PingCAP联合创始人兼CEO刘奇:好的产品应开源,不闭门造车 【深入浅出Koa】常用工具分享 帮你降低编程难度 Relay: 全新的React数据获取框架 探索游戏开发面临的技术挑战——MDCC 2015游戏开发专场议程曝光 【SDCC讲师专访】易开发创始人潘俊勇:这些年我遇到的那些坑 【CTO讲堂】OpenStack行业实践和发展趋势探讨 万物互联,移动为先:MDCC 2015移动开发者大会盛大开幕! 【MDCC 2015】微软开发体验与平台事业合作部大中华区DX部门总经理Srikanth Raju:物联之上云+端 英雄会晚宴,Top开发者共聚“华山之巅” 【MDCC 2015】产品与设计专场(上):百度研究院、印象笔记等专家齐聚,以实例探讨如何打造好产品 【MDCC 2015】产品与设计专场(下):网易云音乐、在行、三节课、去哪儿网、野兽骑行大咖的产品之路 友盟:把数据用活 让开发者享受大数据红利 友盟:用活大数据 让精细化运营为移动开发者服务 携手世纪互联 IBM Bluemix云平台落地中国 【MDCC 2015】IoT峰会—硬件开发与技术专场(下):专家齐聚,共同打造联网新时代 【MDCC 2015】虚拟现实专场(下):虚拟现实的“困”与“竞” 【CTO讲堂】面对世界竞争对手,如何拿到Google PDF开源项目PDFium? 提升网站性能开发的10个技巧 SDCC 2015:顶尖技术精英云集 大会日程及首批讲师议题公布 《近匠》专访猿团创始人CEO谢恩明:梦想、未来、改变 《近匠》专访小熊尼奥:从软硬结合到IP合作,AR产品的机遇 如何动态建立字符数组? 都是面向对象,怎么JAVA和C++对此代码结果不同?欢迎高手讨论! 如何解决线程函数与窗体的交互 vb+SQL2000的奇怪出错提示 请问怎么作出jar文件? 急!!!谁有RTF文件格式中元素说明?给一份!谢先!!!!70分奉上!!! java plug-in 1.3.1是什么东东?如何用? ASP中用foxpro数据库,删除记录的问题,我急。。。 急急急 兄弟我用HTML Help workshop 制作帮助,无法显示图片和默认页,那位来切磋一下好吗 怎么判断打印完毕和打印故障和取消打印的状态? php网络程式的问题。 用C++如何实现多进程ftp功能? 加了个硬盘,整个系统全乱了,怎么办? delphi 6手册组,我翻译好的文件无法上传,谁知道该怎么办? 我不想用第三方控件,如果我想使把Panel中的内容达到一个清屏效果(便如由上向下刷新,但最前有一些粉碎状效果,或是百叶窗什么的。) 有关异常的问题 如何用最简单的方法控制在数据窗口最后一列按回车键增加一行? 哪有ASP的技术手册呀?有关组件用法的 那位能有一个使用xpoint的应用?我不知道应该怎么用xpoint,有什么好??? 为什么我建立了两个读写线程,当频繁读写硬盘后,无法刷新界面呢? 再请教:如何得到浏览器的窗口的尺寸? 高分求助!!!怎样用VC在98下建立一拨号连接? 曾经的话题想改变命运的请走进来不想再说多少有自已看懂了的曾经在这里发过言的朋友可以和我联系,QQ12545029,scaer123@163.net socket编程,如何使connect()30秒超时???? 请问国内有OpenGL的比较全面的代码下载站点吗?能否提供几个URL?谢谢! 关于操作符重载的问题 有什么办法隐藏一个文件夹,使别人清除隐藏属性也看不到。 com的奇怪问题,27分 新手三层结构。问题多多。。。 jsp怎样连数据库? 高分讨教:这个vb+SQL2000的出错提示太奇怪了. 有在深圳考程序员的吗? 大家觉得电信好还是联通好啊 为什么在Win2000下我的GeForce GTS的显卡用了最新的公版驱动,在Windows优化大师中测试 一个小问题,如何在Access97数据库中创建和使用临时表??? 请问一个问题:有一个字符串,我想去掉左边固定的几个字符,剩下右边未知的几个字符!怎么做?谢谢~~ 菜鸟提问,网页上的自动变化的图片用什么作的呀? 请问哪有免费的web mail系统下载? 如何新建一个数据链接? 我想给自己的控件加一个ImageList和ImageIndex属性,选中ImageList后,在ImageIndex中显示图像列表。应如何做? 曾经的话题想改变命运的请走进来不想再说多少有自已看懂,了的曾经在这里发过言的朋友可以和我联系,QQ12545029,scaer123@163.net 如何在ASP中实现广告的按比率播放? dbedit 的问题,???????? private 里声明的函数居然调用不了? 如何得到字体的宽度和高度? ???????如果你说你对DELPHI懂,请进 SAMPLE QUESTION 在DELPHI中如何使用其他语言开发的主见? 请问LINK : warning LNK4098: defaultlib "mfcn42d.lib" conflicts with use of other libs; use /NODEFAULTLIB:library是什么含义? 请问,如何删除一个单项链表的头节点?? 怎样成为编程高手!请教高手们!! 任何一个圆的周长除以直径的( )叫做圆周率,他是一个.小数,用字母...表示 已知函数f(x)=a^x(a大于0,且不等于1)的函数图像过点(9,2) (1)求f(x)的解析式 (2)若x的范围是[-1/2,3],求f(x)的值域 快下课了,要收卷了, 第2题怎么做?要列算式 数学试题测试卷 这两题怎么做怎么列算式请各位学霸帮下忙 第(2)题怎么列算式啊?急 2008年初三教学质量检测数学试卷22.如图,阴影部分表示东西方向的一条笔直公路,点A、B表示公路北侧间隔100米的两根电杆所在的位置,点C表示电视塔所在的位置.小王在公路南侧自西向东沿直 下面那道题(列算式) 东东今年十三岁 却只过了三个生日 他是几月几日出生的 为什么 问题解答 已知锐角A、B,满足sinA=5的根号/5,cosB=3倍10的根号/10,则A+B=? 这两题怎么列算式? 半圆的周长等于该圆周长一半, 已知锐角a,b满足sina=五分之根号五,cosb=十分之三根号十,求a+b如题 一点思路都没有 当圆的半径等于2分米时,这个圆的周长和面积相等选对错 半圆的周长等于圆周长的一半.判断题急 初一期中测试数学试卷分析100份我考了85100份我考了85 要200字以上 以后该怎么学数学 一个半圆的周长等于同半径圆的周长的一半对还是错? 说明原因 半圆的周长等于圆周长的一半,加上一条直径.老师说对的,我觉得不对,因为半径不同.问下.谁有较充分的理由说明? 已知a,b均为锐角,sina=2倍根号5\5,cosb=根号10\10,求a+b的值. 九,将下面两题分别列出二种不同算式.( ⊙ o ⊙ )1、学校里有16棵李树,李树的棵数是桃树的 ,两种树共有多少棵?2、 粮店运进大米和面粉的质量比是7∶4,已知大米比面粉多运来450千克,运进大米 请教我做这两题,请第2题请列算式. 在△ABC中,角A,角B都为锐角且SinA=1/2,CosB=根号2/2则角A=_______角B=_______角C=_______ 注意比较下面两题的区别,再列出算式.1.一堆贷堆运走3分之2吨后还剩4分之3吨,这堆货物有多少吨?2.一堆贷堆运走3分之2吨后还剩4分之3吨,这堆货物有多少吨? 小红的妈妈比小红大24岁,可是她们过的生日一样多.猜一猜小红妈妈的生日是几月几日 半圆的周长公式?半圆周长是否包含直径?半圆是不是封闭图形?@-@ a、b均为锐角,sina=根号5/5 cosb=(3根号10)/10,求a+b的值.PS.应该是cosb=—(3根号10)/10 ,应该是cosb=—(3根号10)/10 ,应该是cosb=—(3根号10)/10 就这两题了,希望能列出算式 a方+b方-6a-2b+10=0 求根号a-根号b分之根号a+根号b的值? 小学数奥题,要求列算式法1.五(1)班有七分之四的学生订了《我爱数学》,十四分之五的学生订了《故事大王》,订两种读物的同学一共占全班的十四分之十一,两种读物都订的占全班的多少?2. 帮我列出这道题的算式. 一道数学试题点E、F、G、H分别为面积为2的平行四边形ABCD的四边中点,分别连接AH、BE、CF、DG,求平行四边形IJKL的面积. 十六进制减法计算啊~急十六进制从0开始么?F-0等于多少?0是最小的吧? (1)根据科学家的推算,地球上1千克的物体在月球上重约0.16千克.王明体重38千克,在月球上的体重是多少千克?(2)小明做一到除法算式时,把除数6看成9,算出的商是3.4.正确的商应该是多少? 生活中还有哪些进制计数法 小学三年级习题要列算式的 数学试题行列式的计算计算行列式1、D=2 3 4 53 4 5 64 5 6 75 6 7 8的行列式值,望各位朋友详解,2、已知行列式a1+b1 a1-b1a2+b2 a2-b2 =-4 求a1 b1a2 b2 生活中还使用那些进制计数法? 十六进制与十六进制减法运算请问2009H-1H得多少.是怎么计算出来的,能给一个公式不? 小学数学试题的难度系数如何计算 有哪些进制计数法 分数,加减的计算法则 圆的周长等于他半径的几倍 平时生活中的进制计数法 设A={x|x^2-ax+a^2-19=0},B={x|x^2-5x+6=0},C={x|x^2+2x-8=0}(1)A∩B=A∪B,求a的值(2)Φ真包含于A∩B,且A∩C=Φ求a的值 圆的周长是半径的几倍 生活中的进制计数法 △ABC的外接圆半径R=√3 ,角A,B,C的对边分别是a,b,c,且(2sin A—sin C)/sin B=cosC/cosB(1)求角B和边长b(2)求△ABC面积的最大值及取得最大值时的a,c的值,并判断此时三角形的形状 圆的周长是它半径的几倍? 圆的周长和它{ }的{ },叫做圆周率,用字母{ }表示,计算时取{ }圆的周长和它{ }的{ },叫做圆周率,用字母{ }表示,计算时取{ } 怎么写 1,数列『an』的前n项和Sn与第n项an之间的关系满足2×lg【二分之(Sn-an+1)】=lgSn+lg(1-an).求an和Sn.2,已知数列『an』是公比大于1的等比数列,(a10)^2=15,Sn是前n项和,Tn=1/a1+1/a2+……+1/an,求满足Sn 圆的周长与半径的比值等于( ). 圆的周长与他的半径的( )叫做圆周率,用字母( )表示. 圆的周长=《 》×《 》,用字母表示是C=《 》 已知b=根号-(a-3)平方+4,c的平方根等于它本身,求a+根号b-c的值.急用! 圆的周长与它的直径的( )叫做圆周率,用字母( )表示,圆周率是一个( )小数. 0.3^-1+(-1/3)^-2+4^0.5-3^-1+5.5^0=?请写具体一点, 式子怎么列 第二题 圆周率表示圆的( )和( )的比值,所以圆的周长=()×(),用字母表示是() 圆的周长=( )或( ).(用字母表示) 列算式
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn