原文:Swift: Using String Ranges The Functional Way编程
几周以前,我介绍了『Swift中如何使用Range截取字符串』。那时,Swift中使用Range为何如此艰难让人迷惑不解,可是至少咱们找到一种能够工做的使用方法。
swift
然而,当我在过去几周学习了许多函数式编程的知识以后,突然意识到,Swift中的Range之因此这么难用是为了引导咱们以一种更加具象的方式使用它--具体来讲就是相似于函数式编程的方式。app
经过观看edX FP101x课程,我学到的第一条知识就是head和tail的概念。事实上,最初的一节课程中整整花费了五分钟的时间来介绍head和tail的概念,而且在以后的课程中也一直都有说起到这两个概念。概念自己很是简单:head是list的第一个元素,tail是除去list中第一个元素之外的其余元素组成的list。函数式编程
head[1,2,3,4,5] // 1 tail[1,2,3,4,5] // [2,3,4,5]
在函数式编程中,甚少使用经典的for循环处理问题,取而代之的是使用head、tail和递归的方式处理list中的元素的操做。
函数
下面咱们来看一个具体例子:获取一个单词中前x位的字符。若是不考虑使用Swift中的Ranges(由于确实不易用),你可能会用下面的方式实现:
学习
func getSubstringUpToIndex(index: Int, fromString str: String) -> String { var substring = "" for (i, letter) in enumerate(str) { substring.append(letter) if i == index - 1 { break } } return substring } getSubstringUpToIndex(5, fromString: "Hello, NatashaTheRobot") // Hello
如今来看看函数式编程的思想,使用head、tail和递归如何实现:
spa
func getSubstringUpToIndex(index: Int, fromString str: String) -> String { let (head, tail) = (str[str.startIndex], dropFirst(str)) if index == 1 { return String(head) } return String(head) + getSubstringUpToIndex(index - 1, fromString: tail) } getSubstringUpToIndex(5, fromString: "Hello, NatashaTheRobot") // Hello
看过上面的例子,我想你们对于Swift为什么设计这么难用的Ranges、startIndex、endIndex有了一些本身的认识。.net
对于上面的例子,也可使用我在『Swift中如何使用Range截取字符串』中描述的方法,可是经过上面介绍的采用函数式的解决方案,取代for循环的解决方案,咱们能够开始更多的思考如何使用函数式编程的思想来解决问题。毕竟,这种关注头和尾的方式(同时没有更简单的方式来解决问题)在不少Swift的API中都有体现。设计