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入门(四)——可选类型(Optionals)与断言(Assert)】
【Swift入门(九)——String与Int、Double、Float等数字相互转换】
【Swift入门(十二)——利用Extension添加逆序输出字符串方法】
版权声明:本文为博主原创文章,未经博主允许不得转载。