阅读更多
在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
0
0
评论 共 2 条 请登录后发表评论
2 楼 kanme818 2015-02-17 11:46
weiqingfei 写道
这种如同nodejs的使用方法,最终会导致callback hell,从一个极端走向另一个极端。


callback感觉就像是写作者的天堂,维护者的地狱,调试难的一比,完全不知道断点什么时候进来,多个callback进来的顺序可能还不一样
1 楼 weiqingfei 2015-02-17 10:20
这种如同nodejs的使用方法,最终会导致callback hell,从一个极端走向另一个极端。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • rails 连接mysql的问题解决

    – c:/ruby/lib/ruby/gems/1.8/gems/mysql-2.7.3-x86-mswin32/ext/mysql.so 实际上是找不到连接所需的dll文件:libmySQL.dll 在mysql安装目录下的bin目录下将此文件复制到ruby的bin目录下即可解决此问题. ...

  • Rails应用程序中同时修改操作冲突问题的解决方案

    Rails 应用程序中操作冲突是一个常见问题,Rails 提供了简单有效的解决方法。 举一个实际的例子:我们的系统里有一个商店模块,商店中重要的一块是对产品信息的管理,比如运营人员常常会编辑产品的信息,包括产品...

  • Ruby on Rails中jquery_ujs组件拖慢速度的问题解决

    主要介绍了Ruby on Rails中jquery ujs组件拖慢速度的问题解决,jquery_ujs是Rails框架中涉及AJAX交互的组件,需要的朋友可以参考下

  • rails_pattern_view:曾经因为必须在非常常见的页面上复制粘贴Rails视图而感到烦恼,但是这个gem可以解决这个问题

    曾经因为不得不在非常常见的页面上复制/粘贴Rails视图而烦恼,此gem将解决此问题一次创建您的view文件夹(模式)并指示您的控制器使用该模式 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails_pattern_view...

  • 采用UTF-8解决Ruby on Rails程序的中问题

    1.将.rb文件和.rhtml文件都保存为utf-8格式; 2.在/app/Controller/application.rb中增加... 您可能感兴趣的文章:Ruby rails 页面跳转(render和redirect_to)学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rail

  • js-problem-solver:一个带有JavaScript的Rails应用程序,它将解决您所有的问题! 这个单页应用程序允许用户发布问题并接收用户提交的解决方案

    解决问题者有一个自定义的API,其中包含用户提交的问题和解决方案。 该API是使用Fast JSON gem生成的,以加快序列化速度。 JavaScript前端在单个动态页面中创建和显示应用程序,并与Rails后端模型和控制器进行通信以...

  • rails_interview_questions:一些基本的Rails面试问题清单

    Rails面试问题 通过以及其他地方,我收到了很多有关在Rails开发人员的采访中使用/期望使用哪些问题的问题,因此我想我会把...知道您是否正在面试一个全职还是以后端为重点的职位。 在Github / Bitbucket /任何地方都可

  • rails和mysql数据库连接中出现的问题以及解决办法

    NULL 博文链接:https://like-eagle.iteye.com/blog/994634

  • Rails bundle命令安装mysql gem包出错的解决方法

    解决 Rails bundle 安装不上 mysql gem包的问题 环境 ubuntu 12.04 ruby-2.1.1 首先 新建一个的一个项目,在该项目上执行 bundle install 提示 代码如下: … Make sure that gem install mysql2 -v ‘0.3.16’; ...

  • rails飞信 gem plugin api 插件的问题解决方案

    NULL 博文链接:https://rubyrails.iteye.com/blog/503547

  • 设计:带有Warden的Rails的灵活身份验证解决方案

    Devise是基于Warden的Rails灵活的身份验证解决方案。 它: 基于机架; 是基于Rails引擎的完整MVC解决方案; 允许您同时登录多个模型; 基于模块化概念:仅使用您真正需要的东西。 它由10个模块组成: :哈希并...

  • actions_as_textcaptcha:Rails的基于文本的逻辑问题验证码

    ActsAsTextcaptcha通过基于文本的逻辑问题验证码为Rails模型提供垃圾邮件保护。 问题来自 。 它们很容易被人类解决,但机器人很难破解。 您还可以根据自己的问题配置gem。 作为替代方案,也可以作为处理任何API...

  • 阿里云部署rails应用遇到的问题与解决方案

    git clone失败:Permission denied (publickey) 原因:缺少ssh keys 解决方法:执行ssh-keygen -t rsa生成public key,拷贝上述命令生成的id_rsa.pub文件中的值,将其添加到github的ssh keys中。

  • js-namespace-rails:js-namespace-rails让您选择可以在rails资产管道中执行的javascript代码段

    js-namespace-rails可以通过使用它的方法来命名空间并根据哪个Rails控制器动作处于活动状态来选择性地执行某些JavaScript,从而解决此问题。 安装 将此行添加到您的应用程序的Gemfile中: gem 'js-namespace-rails...

  • koa-logs-full:仿照rails风格的轻量log库,可以按rails的log风格记录请求日志。可以很好的解决nodejs由于单进程导致的日志串起来的问题

    解决方案也很简单,针对koa的每个请求的context,维护一个局部的cache,写日志的时候不要直接写,而是先存起来,等请求结束的时候再一次性输出。这样就不会有串行的问题。 处理了那些内容? 默认记录了基本的请求...

  • SmartTruncate:smart_truncate 是一个简单的 Rails gem,可以像人类一样截断文本

    SmartTruncate 解决了这个问题。” 安装 gem install smart_truncate BASIC smart_truncate USE # truncate by characters and it will end in a meaningful word SmartTruncate . by_chars ( "I am a nice ...

  • 解决安装rails卡住很慢的问题

    换源 gem source -a https://gems.ruby-china.com 然后执行安装rails gem install rails

  • 管理:一个Rails引擎,可帮助您组合一个超级灵活的管理仪表板

    管理 在Rails中创建灵活,功能强大... Administrate解决了与和相同的问题,但旨在为站点管理员提供更好的用户体验,并使开发人员更易于自定义。 为了实现这些目标,Administrate遵循一些指导原则: 没有DSL(特定于

  • spring-ai-spring-boot-autoconfigure-1.0.0-M5.jar中文文档.zip

    # 【spring-ai-spring-boot-autoconfigure-***.jar中文文档.zip】 中包含: 中文文档:【spring-ai-spring-boot-autoconfigure-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【spring-ai-spring-boot-autoconfigure-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-spring-boot-autoconfigure-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-spring-boot-autoconfigure-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-spring-boot-autoconfigure-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-spring-boot-autoconfigure-***.jar中文文档.zip,java,spring-ai-spring-boot-autoconfigure-***.jar,org.springframework.ai,spring-ai-spring-boot-autoconfigure,***,org.springframework.ai.autoconfigure.anthropic,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,springframework,spring,ai,boot,autoconfigure,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【spring-ai-spring-boot-autoconfigure-***.jar中文文档.zip】,再解压其中的 【spring-ai-spring-boot-autoconfigure-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-spring-boot-autoconfigure</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'org.springframework.ai', name: 'spring-ai-spring-boot-autoconfigure', version: '***' Gradle (Short): implementation 'org.springframework.ai:spring-ai-spring-boot-autoconfigure:***' Gradle (Kotlin): implementation("org.springframework.ai:spring-ai-spring-boot-autoconfigure:***") ``` # 含有的 Java package(包): ``` org.springframework.ai.autoconfigure.anthropic org.springframework.ai.autoconfigure.azure.openai org.springframework.ai.autoconfigure.bedrock org.springframework.ai.autoconfigure.bedrock.anthropic org.springframework.ai.autoconfigure.bedrock.anthropic3

  • 50页-道路环卫保洁服务项目管理计划方案.pdf

    在当今智慧城市的建设浪潮中,智慧环卫作为城市管理的重要组成部分,正以其独特的魅力引领着环卫行业的变革。本方案旨在通过一系列高科技手段,如物联网、大数据、云计算等,全面提升环卫作业效率与管理水平,为城市居民创造更加清洁、宜居的生活环境。 一、智慧环卫系统概述与核心亮点 智慧环卫系统是一个集机械化保洁、垃圾清运、设施管理、事件指挥调度等多功能于一体的综合性管理平台。其核心亮点在于通过高精度定位、实时监控与智能分析,实现环卫作业的精细化管理。例如,机械化保洁管理子系统能够实时监控机扫车、洒水车等作业车辆的运行状态,自动规划最优作业路线,并根据作业完成情况生成考核评价报表,极大地提高了作业效率与服务质量。同时,垃圾清运管理子系统则通过安装GPS定位设备和油量传感器,对清运车辆进行全方位监控,确保垃圾清运过程的规范与高效,有效解决了城市垃圾堆积与随意倾倒的问题。此外,系统还配备了垃圾箱满溢报警系统,通过智能感应技术,当垃圾箱内垃圾达到预设高度时自动报警,提醒作业人员及时清运,避免了因垃圾满溢而引发的居民投诉与环境污染。 二、智慧环卫系统的趣味性与知识性融合 智慧环卫系统不仅实用性强,还蕴含着丰富的趣味性与知识性。以餐厨垃圾收运管理子系统为例,该系统通过为餐厨垃圾收运车辆安装GPS定位、车载称重、视频监控等多种感知设备,实现了对餐厨垃圾收运过程的全程监控与智能管理。作业人员可以通过手机APP实时查看车辆位置、行驶轨迹及收运情况,仿佛在玩一场现实版的“垃圾追踪游戏”。同时,系统还能自动生成餐厨垃圾收运统计报表,帮助管理人员轻松掌握收运量、违规情况等关键数据,让数据管理变得既科学又有趣。此外,中转站视频监控子系统更是将趣味性与实用性完美结合,通过高清摄像头与双向语音对讲功能,实现了对中转站内外环境的实时监控与远程指挥,让管理人员足不出户就能掌控全局,仿佛拥有了一双“千里眼”和一对“顺风耳”。 三、智慧环卫系统的未来展望与社会价值 随着科技的不断进步与智慧城市建设的深入推进,智慧环卫系统将迎来更加广阔的发展前景。未来,智慧环卫系统将更加注重数据的深度挖掘与分析,通过大数据与人工智能技术,为城市环卫管理提供更加精准、高效的决策支持。同时,系统还将加强与其他城市管理系统的互联互通,实现资源共享与协同作战,共同推动城市管理的智能化、精细化水平。从社会价值来看,智慧环卫系统的推广与应用将有效提升城市环境卫生质量,改善居民生活环境,提升城市形象与竞争力。此外,系统还能通过优化作业流程、减少资源浪费等方式,为城市可持续发展贡献重要力量。可以说,智慧环卫系统不仅是城市管理的得力助手,更是推动社会进步与文明发展的重要力量。

Global site tag (gtag.js) - Google Analytics