Swift入门(十二)——利用Extension添加逆序输出字符串方法

Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法。

首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法。下面先贴上代码,然后解释一下这段代码。

//String+Operation.swifft
import Foundation

//逆序输出swift中的字符串
extension String{
    func Reverse() -> String{
        var returnString: String = ""
        for (var i = count(self) - 1; i >= 0; --i) {
            returnString.append(self[advance(self.startIndex, i)])
        }
        return returnString
    }
}

由于Swift中的String,是可拓展字母集的集合,所以苹果不建议我们直接通过整数下标对其进行操作,因为这可能会往原本要构成一个完整单词的若个Unicode标量中插入数据。

Different characters can require different amounts of memory to store, so in order to determine which Character is at a particular position, you must iterate over each Unicode scalar from the start or end of that String. For this reason, Swift strings cannot be indexed by integer values.

所以想要遍历String,可以用String的index来处理。首先看一下源码:

struct Index : BidirectionalIndexType, Comparable, Reflectable {
        func successor() -> String.Index
        func predecessor() -> String.Index
        func getMirror() -> MirrorType
    }
subscript (i: String.Index) -> Character { get }

可以发现,String定义了附属脚本,传入的参数是一个String.Index类型的变量,而这个Index是在swift中定义了的结构体,有successor和predecessor等方法。

而advance方法第一个参数表示其实index,第二个参数的偏移量。通过

self[advance(self.startIndex, i)]

这句代码其实就变相的利用下标来遍历字符串了,取出的Character类型的元素,这时候只要调用append方法即可。

拓展(Extension)的使用也很简单:

var s: String = "hello world"
println(s.Reverse())
// 输出结果是 dlrow olleh

如果完全使用index而不涉及下标也是可以的,比如下面这段代码可以顺序遍历String:

for (var index = self.startIndex; index != self.endIndex; index = index.successor()){
    returnString.append(self[index])
}

但是这种方式不适合逆向遍历字符串,因为可以看到self[self.startIndex]读取的是字符串的第一个character,但不能使用self[self.endIndex],否则会出越界错误。因此如果用这种方式尝试逆序遍历字符串,会比较麻烦。还是推荐使用第一种。

查看完整专栏——《Swift轻松入门》

【Swift入门(一)——基本语法】

【Swift入门(二)——字符与字符串】

【Swift入门(三)——元组(Tuple)】

【Swift入门(四)——可选类型(Optionals)与断言(Assert)】

【Swift入门(五)——数组(Array)】

【Swift入门(六)——字典(Dictionary)】

【Swift入门(七)——结构体(Struct)】

【Swift入门(八)——功能强大的求余运算符】

【Swift入门(九)——String与Int、Double、Float等数字相互转换】

【Swift入门(十)——循环引用、弱引用和无主引用】

【Swift入门(十一)——类型转换与is、as操作】

【Swift入门(十二)——利用Extension添加逆序输出字符串方法】

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 06:00:45

Swift入门(十二)——利用Extension添加逆序输出字符串方法的相关文章

算法竞赛入门经典_3.1_数组_逆序输出_开灯问题

又是新的一天,继续更新. 今天进入了新的章节,数组和字符串 1.逆序输出问题: 先来看代码吧 #include <stdio.h> //逆序输出 2017-8-16 #define maxn 105 int a[maxn]; int main(int argc, char* argv[]) { //int a[maxn]; int x, n = 0; while (scanf("%d", &x) == 1) a[n++] = x; for (int i = n -

杭电ACM1321——Reverse Text~~逆序输出字符串

简单的字符串逆序输出. AC代码: #include <iostream> #include <cstring> using namespace std; int main() { char str[100000]; int n; while(cin >> n) { getchar(); for(int i = 0; i < n; i++) { gets(str); int length = strlen(str); for(int j = length - 1;

逆序输出字符串

#include <stdio.h>#include <string.h>int main (){ char str[100]; int i,j; gets(str); j=strlen(str); for(i=j-1;i>=0;i--) { printf("%c",str[i]); }    return 0;}

字符串反序,逆序输出字符串

要注意\0问题. 在下面++,而不是在while中++. --j.但是也不对,会把\0结束符弄到前面. 改为: #include "stdafx.h" void Reverse(char str[]) { int i=0,j=0; char c=0; while(str[j]) ++j; while(i<--j) { c=str[i]; str[i]=str[j]; str[j]=c; ++i; } //看下面,是先将a和g对调,d和d对调,依次首尾对调. } int _tmai

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

[WebGL入门]十二,模型数据和顶点属性

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 顶点属性的意思 上次的文章中,介绍了一下从着色器的生成,编译,到程序对象的生成和着色器的连接.这次,简单的说一下模型数据的定义和顶点属性的处理.另外,介绍一下根据模型数据生成VBO的方法.VBO的使用要比生成难理解一些,但是不要担心,后面会慢慢说明.接下来看一下顶点属性.顶点属性,说的简单点,

swift 笔记 (十二) —— 下标

下标 swift允许我们为 类,结构体,枚举 定义下标,以更便捷的方式访问一大堆属性.比如Array和Dictionary都是结构体,swift的工程师已经为这两个类型提供好了下标操作的代码,所以,我们才可以通过 myArray[2]这种方式,读取和改写这个struct中保存的数据.而且,一个类型中可以定义多种下标访问方式(重载,关于重载,在后面的笔记中会提到,这里先不用太在意) 下标可以定义为"读写"型的,也可以定义为"只读"型,这种行为,是通过定义一组操作完成的

(十二)Zabbix添加snmp服务设备(防火墙)

(十二)Zabbix添加snmp服务设备(防火墙) 背景: 1.zabbix服务器搭建完成 思路: 1.定被监控设备开启snmp,默认团体名称建议更改 2.zabbix服务端网络层面能否到达被监控端 3.通过zabbix服务器获取OID(可以网上查找OID是做什么的或者官方网站查找OID的值) 4.根据自己的ITEM监控项(可自定义或网上搜索模板)添加监控主机 5.本内容仅供参考,以便以后学习使用. 参考文档: http://www.zabbix.org/wiki/Zabbix_Template

Java入门:一些初学者需要掌握的基础算法程序——逆序输出

[问题] 将一个整数逆序输出. [思路] 有三种方法可以将一个数逆序输出: 1)使用while循环 2)使用for循环 3)使用递归 [代码] 程序1:使用while循环 import java.util.Scanner; class ReverseNumberWhile { public static void main(String args[]) { int num=0; int reversenum =0; System.out.println("Input your number an