添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法。首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法。下面先贴上代码,然后解释一下这段代码。//String+Operation.swifftimport Foundation//逆 输入: "Let's take LeetCode contest" 输出: "s'teL ekat edoCteeL tsetnoc" 注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格 func reverseWords(_ s: String) -&g... 编写一个函数,其作用是将输入的字符串反转过来,输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题 你可以假设数组中的所有字符都是ASCII码表中的可打印字符。 思想:第一个和最后一个交换,依次类推 func reverseString(_ s : inout [Stri... 1 var name2 : [String] = ["Alice","Mike","Bob","May","Cake"] 3 name2 = name2.sorted({name1 , name2 in 5 return na...
NSString * str = @"abcdefg"; NSMutableString * string = [[NSMutableString alloc]initWithCapacity:str.length]; int j = (int)str.length; for (int i = j - 1; i >= 0; i--) {
字符串反序操作,可以分为两种类型,一种是将字符串的反序存储,一种是将字符串反序输出。         对于前一种,假设字符串长度为n,可以从第1个字符到第floor(n/2) (取整函数,取得不超过某个数的最大整数)个字符,依次将第i个字符和第n+1-i个字符交换位置。这一结束后,字符串就反序存储了。         对于后一种,可以采取两种方法。第一种方法是从字符串的最后一个字符逆序遍历到第
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 void reverseString(char* s, int sSize) { if (sSize < 2){