文档章节

[Swift]以函数式编程的方式使用字符串中的Ranges

Redding
 Redding
发布于 2014/12/18 23:04
字数 776
阅读 241
收藏 5

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

原文:Swift: Using String Ranges The Functional Way

几周之前,我介绍了『Swift中如何使用Range截取字符串』。那时,Swift中使用Range为什么如此艰难让人疑惑不解,但是至少我们找到一种可以工作的使用方法。

然而,当我在过去几周学习了许多函数式编程的知识之后,忽然意识到,Swift中的Range之所以这么难用是为了引导我们以一种更加具象的方式使用它--具体来说就是类似于函数式编程的方式。

通过观看edX FP101x课程,我学到的第一条知识就是head和tail的概念。事实上,最初的一节课程中整整花费了五分钟的时间来介绍headtail的概念,并且在之后的课程中也一直都有提及到这两个概念。概念本身非常简单: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中都有体现。

© 著作权归作者所有

Redding
粉丝 14
博文 49
码字总数 22869
作品 0
南京
程序员
私信 提问
[Swift]如何使用Range截取字符串

原文:How To Find A Substring In Range of a Swift String Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多...

Redding
2014/12/17
9.7K
0
iOS 中的链式编程、函数式编程入门

对一个程序猿来说,从一开始接触编程后会逐渐经历好几个不同的编程思想。包括过程式编程、面向对象编程、响应式编程、函数式编程、链式编程等等。 的特点是随着程序的编写逐步进行,写到哪儿...

BennyLoo
2017/11/08
0
0
学习苹果Swift语言的一些在线资源(2014年9月10日更新)

Swift是苹果为OS X和iOS平台引入的一种新的程序设计语言,这种程序设计语言已经激发了开发者社区的大量关注。仅仅几天之内,在Stack Overflow网站上提出的关于Swift的问题已经有500多个,在G...

tyou
2015/08/11
89
0
Swift4.0基础知识回顾

简单介绍一下Swift Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序,Swift语言让应用开发更简单、更快、更稳定,确保最终应用有着更好的质量更多了解Swift可以去《The...

博行天下
2017/12/06
0
0
关东升的《《从零开始学Swift》即将出版

大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版《从零开始学Swift》《从零开始学Swift》将在《Swift开发指南》第1版的基础上添加Swift2.0的...

智捷课堂
2015/08/17
111
0

没有更多内容

加载失败,请刷新页面

加载更多

数据结构(树)

树: 树是n个结点的有限集合,有且仅有一个根结点,其余结点可分为m个根结点的子树。 度: 指的是一个节点拥有子节点的个数。如二叉树的节点的最大度为2。 高度/深度: 数的层数,根节点为第...

潦草的犀牛
14分钟前
2
0
“同步”是什么意思?

我对synchronized关键字的用法和重要性有一些疑问。 synchronized关键字的意义是什么? 方法应何时synchronized ? 从程序上和逻辑上是什么意思? #1楼 据我了解,同步基本上意味着编译器在您...

javail
26分钟前
3
0
sed -i linux 批量替换命令

批量替换 /usr/local/rocketmq/conf 目录下 的 xml 里头的 ${user.home} 替换为 /usr/local/rocketmq # mkdir -p /usr/local/rocketmq/logs# cd /usr/local/rocketmq/conf && sed -i 's#${......

jxlgzwh
33分钟前
4
0
如何在嵌入式CSS中编写a:hover?

我有一种情况,我必须编写内联CSS代码,并且我想在锚点上应用悬停样式。 如何在HTML样式属性内的CSS中使用a:hover ? 例如,您不能在HTML电子邮件中可靠地使用CSS类。 #1楼 简短的答案:您不...

技术盛宴
41分钟前
4
0
一些常用工具下载

golang: https://dl.google.com/go/go1.13.5.window-amd64.zip https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz 更换版本号可以下载其他版本。...

bobby2006
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部