阅读更多

0顶
0踩

编程语言
本文出自:Natasha The Robot,作者:Natasha Murashev,译文出自:SwiftGG,译者:张伟璐

昨天,我在代码库中找到一段我所认为的极具Swift风格的代码。
var minionImages = [UIImage]()
for i in 1...7 {
    if let minionImage = UIImage(named: "minionIcon-\(i)") {
        minionImages.append(minionImage)
    }
}

这真是使用函数式编程进行重构的绝佳机会,哦吼吼!我可以做函数式编程了!!!是的,我非常激动。

那么,明显的解决方案是在这儿使用map:
let minionImagesMapped = (1...7)
    .map { UIImage(named: "minionIcon-\($0)") }

我对自己感到很满意,这段代码只有一行。但这样做无法满足之前的一个必要条件——我需要[UIImage]数组,但是这段代码返回的是可选类型[UIImage?]数组。

所以我Google了一下,为了得到非可选类型的UIImages数组,可以使用如下方法:
let minionImagesFiltered = (1...7)
    .map { UIImage(named: "minionIcon-\($0)") }
    .filter { $0 != nil}
    .map { $0! }

这样的确有用,但是我并不开森。这段代码又长又拙笨,而且我讨厌强制解包可选类型,虽然这里不会出错。不过这都是小事,主要的原因是这样看起来并不像原生for循环那样简单有效。如下图所示:



可能这样做是错的,但是我最后还是选择了for循环。我的结论是:在Swift中偶尔使用for循环是可以的。当然我可能遗漏了一些东西,如果有,请在评论中告诉我!

升级

由于有些童鞋在下面的评论中以及Twitter上指出,可以在这里使用 Swift 2.0 的flatMap,我进行了修改:
let minionImagesFlattened = (1...7).flatMap { UIImage(named: "minionIcon-\($0)") }

在这里,我不得不诚实的说,每次看到flatMap时,我都无法完全理解它做了什么或是怎么做的。它并不像map以及filter那样自然。我不懂它在这儿是怎么做的,所以必须要去搜索一下。

由此,我再次得出结论:使用flatmap不能提高代码可读性。如果那些对Swift和函数式编程了解不多的人看到这段代码,他们能理解发生了神马吗?相反,我可以确定,每个人只需看一眼就能够理解for循环。
  • 大小: 91.5 KB
来自: SwiftGG
0
0
评论 共 0 条 请登录后发表评论

发表评论

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

相关推荐

  • 函数式 Swift

    objc, objc.io 中国, 函数式 swift 王巍 喵神 onevcat swift

  • Swift:什么时候不适合使用函数式方法

    昨天,我在代码库中找到一段我所认为的极具 Swift 风格的代码。var minionImages = [UIImage]()for i in 1...7 { if let minionImage = ...) { minionImages.append(minionImage) }}这真是使用函数式编程进行重构的...

  • 函数式编程中的Swift与Swift中的函数式编程

    GMTC全球移动技术大会ppt 作者:傅若愚 主题:函数式编程中的Swift与Swift中的函数式编程

  • 函数式Swift.epub

    函数式Swift.epub函数式Swift.epub 函数式Swift.epub函数式Swift.epub函数式Swift.epub函数式Swift.epub函数式Swift.epub函数式Swift.epub函数式Swift.epub函数式Swift.epub函数式Swift.epub

  • 函数式swift4.0

    附件为 iBook的 epub格式电子书:《函数式 Swift》。 本人花几十块大洋购买的,在这里免费分享给大家,需要的请下载!!

  • 函数式Swift 已对应 Swift 4

    《函数式Swift》 高清PDF,需要的赶紧下载了!!《函数式Swift》 高清PDF,需要的赶紧下载了!!

  • 函数式swift 函数式编程(中文版)高清pdf

    《函数式Swift》是一本引领你进入Swift 函数式编程世界的优秀读物,它让更多的中国开发者有机会接触并了解Swift语言函数式的一面,是广大程序开发者不可多得的工具书。

  • 函数式 Swift4 最新版

    objc, objc.io 中国, 函数式 swift 王巍 喵神 onevcat swift4

  • 函数式 swift

    《函数式Swift》是一本引领你进入Swift 函数式编程世界的优秀读物,它让更多的中国开发者有机会接触并了解Swift语言函数式的一面,是广大程序开发者不可多得的工具书。

  • 函数式编程swift4.0

    函数式编程swift4.0 函数式编程swift4.0 函数式编程swift4.0

  • Swift的函数式编程详解

    主要介绍了Swift的函数式编程详解,本文讲解了Swift概览、Swift递归、Swift 的高阶函数和闭包等内容,需要的朋友可以参考下

  • fun-with-swift:使用Swift进行函数式编程的资源

    使用Swift进行函数式编程该存储库包含有关使用Swift进行功能编程的资料。 执照: 演示幻灯片:创用CC,Attribution-NonCommercial-NoDerivatives 4.0 International(请参阅LICENSE_slides.txt) 代码:BSD3(请参阅...

  • 【java毕业设计】智慧社区在线教育平台(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

  • 基于深度强化学习的德州扑克AI算法优化详细文档+全部资料+源码.zip

    【资源说明】 基于深度强化学习的德州扑克AI算法优化详细文档+全部资料+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

  • 无需安装MobaXterm简约版本,远程工具

    无需安装MobaXterm简约版本,远程工具

  • 蓝桥杯Python组的初级到中级选手练习python案例

    这个脚本包含了常见的算法和编程概念,适合蓝桥杯Python组的初级到中级选手练习。通过这些练习,选手可以: 理解递归算法(如斐波那契数列和汉诺塔问题)。 熟悉基本数据结构和操作(如字符串操作、列表处理)。 学习基本的数学算法(如求最大公约数)。 掌握Python语言的基本语法和内置函数的使用。 比赛中可能会遇到更复杂的问题,但这些练习能帮助你打下坚实的基础。在准备蓝桥杯时,还应该关注算法题库,学习更多数据结构(如栈、队列、树、图等)、算法(如动态规划、贪心算法、搜索算法等),并进行大量的代码实践和调试。

Global site tag (gtag.js) - Google Analytics