Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法。
首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法。下面先贴上代码,然后解释一下这段代码。
import Foundation
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())
如果完全使用index而不涉及下标也是可以的,比如下面这段代码可以顺序遍历String:
for (var index = self.startIndex; index != self.endIndex; index = index.successor())