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

x33g5p2x  于2021-11-18 转载在 Swift  
字(1.9k)|赞(0)|评价(0)|浏览(618)

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添加逆序输出字符串方法】

相关文章