[Swift]以函数式编程的方式使用字符串中的Ranges
2014-12-18 23:04
253 查看
原文:Swift: Using String Ranges The Functional Way
几周之前,我介绍了『Swift中如何使用Range截取字符串』。那时,Swift中使用Range为什么如此艰难让人疑惑不解,但是至少我们找到一种可以工作的使用方法。
然而,当我在过去几周学习了许多函数式编程的知识之后,忽然意识到,Swift中的Range之所以这么难用是为了引导我们以一种更加具象的方式使用它--具体来说就是类似于函数式编程的方式。
通过观看edX FP101x课程,我学到的第一条知识就是head和tail的概念。事实上,最初的一节课程中整整花费了五分钟的时间来介绍head和tail的概念,并且在之后的课程中也一直都有提及到这两个概念。概念本身非常简单:head是list的第一个元素,tail是除去list中第一个元素以外的其他元素组成的list。
在函数式编程中,甚少使用经典的for循环处理问题,取而代之的是使用head、tail和递归的方式处理list中的元素的操作。
下面我们来看一个具体例子:获取一个单词中前x位的字符。如果不考虑使用Swift中的Ranges(因为确实不易用),你可能会用下面的方式实现:
现在来看看函数式编程的思想,使用head、tail和递归如何实现:
看过上面的例子,我想大家对于Swift为何设计这么难用的Ranges、startIndex、endIndex有了一些自己的认识。
对于上面的例子,也可以使用我在『Swift中如何使用Range截取字符串』中描述的方法,但是通过上面介绍的采用函数式的解决方案,取代for循环的解决方案,我们可以开始更多的思考如何使用函数式编程的思想来解决问题。毕竟,这种关注头和尾的方式(同时没有更简单的方式来解决问题)在很多Swift的API中都有体现。
几周之前,我介绍了『Swift中如何使用Range截取字符串』。那时,Swift中使用Range为什么如此艰难让人疑惑不解,但是至少我们找到一种可以工作的使用方法。
然而,当我在过去几周学习了许多函数式编程的知识之后,忽然意识到,Swift中的Range之所以这么难用是为了引导我们以一种更加具象的方式使用它--具体来说就是类似于函数式编程的方式。
通过观看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和递归如何实现:
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有了一些自己的认识。
对于上面的例子,也可以使用我在『Swift中如何使用Range截取字符串』中描述的方法,但是通过上面介绍的采用函数式的解决方案,取代for循环的解决方案,我们可以开始更多的思考如何使用函数式编程的思想来解决问题。毕竟,这种关注头和尾的方式(同时没有更简单的方式来解决问题)在很多Swift的API中都有体现。
相关文章推荐
- HOW TO:使用 Visual C# .NET 在 ADO.NET 中以编程方式构建连接字符串
- 最通俗易懂的方式让你理解 Swift 的函数式编程
- javascript消除字符串两边空格的两种方式,面向对象和函数式编程。python oop在调用时候的优点
- 以编程方式使用批语句节省 数据库 IO 来提高性能
- 使用OLE DB方式连接常用数据库的连接字符串的设置
- http编程中的get和post混合使用方式
- 使用 IBM Rational Software Architect 通过编程方式生成 UML 模型
- 使用javascript以键值对的方式读取查询字符串【QueryString】
- (转)在C#中使用WIA获取扫描仪数据(四、通过编程方式扫描图像)
- C#编程方式使用Silverlight toolkit Chart
- 使用OLE DB方式连接常用数据库的连接字符串的设置
- 以编程方式使用批语句节省 数据库IO来提高性能
- 以编程方式使用 ASP.NET 母版页
- 以编程方式使用 Microsoft Office Visio 2003 ActiveX 控件(经经经经经典)
- [摘自MSDN] ASP.Net2.0学习 [1] 母版页 6 : 以编程方式使用 ASP.NET 母版页
- 使用OLE DB方式连接常用数据库的连接字符串的设置
- 以编程方式使用批语句节省 数据库 IO 来提高性能
- 使用ADO.NET和C#以编程方式创建 SQL Server 数据库
- 使用C#创建webservice及三种调用方式 (ASP.NETweb编程常用到的27个函数集)
- 如何:使用 Split 方法分析字符串(C# 编程指南)