Fork me on GitHub

Swift 实现字符串倒序排列,String 字符串反转

(2018.7.30更新)
最近在看 Swift 的一篇 博客 的时候,发现了一个神级 API:reverse(),这个函数用来反转一个序列,Swift4 中 String 做了一些调整。我们可以直接将 String 作为一个序列进行反转,然后使用 String 的便利初始化方法将反转后的序列转为 String 类型,整个过程只需要一行代码,而且性能比我们自行封装方法要高不少,如果你正在查找 Swift 中反转字符串的方法,请看下面示例代码。然后就不必再往下看了。。。

1
2
3
let abc: String = "abc"
print(String(abc.reversed()))
// cba

 

最近在工作的时候,遇到一个需求,希望能将字符串倒序排列并输出。

先来看一下OC的实现方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 字符串倒序 输入"1234" 输出"4321"
- (NSString *)invertString:(NSString *)str {

NSMutableString *newString = [NSMutableString string];

for(int i = 0; i < str.length; i ++) {

[newString appendString:[str substringWithRange:NSMakeRange(str.length-i-1, 1)]];
}

return newString;
}

// 单词逆序 输入"hello world" 输出"world hello"
- (NSString *)invertWord:(NSString *)str {

NSArray *stringArr = [str componentsSeparatedByString:@" "];

NSMutableArray *newStringArr = [NSMutableArray array];

for (int i = 0; i < stringArr.count; i ++) {

[newStringArr addObject:stringArr[stringArr.count - i - 1]];
}

NSString *string = [newStringArr componentsJoinedByString:@" "];

return string;
}

搞定之后,我灵机一动,又有好些天没有碰 Swift 了,这样下去岂不是要荒废?赶紧打开 Playground,用 Swift 实现一波。

好吧,我承认我懒癌发作了,打开 objectivec2swift.com ,先来个自动转换,看看都发生了哪些变化,结果很快就出来了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 字符串倒序 输入"1234" 输出"4321"
func invertString(_ str: String?) -> String? {
var newString = ""
for i in 0..<(str?.count ?? 0) {
newString += (str as NSString?)?.substring(with: NSRange(location: (str?.count ?? 0) - i - 1, length: 1)) ?? ""
}
return newString
}

// 单词逆序 输入"hello world" 输出"world hello"
func invertWord(_ str: String?) -> String? {
let stringArr = str?.components(separatedBy: " ")
var newStringArr: [AnyHashable] = []
for i in 0..<(stringArr?.count ?? 0) {
newStringArr.append(stringArr?[(stringArr?.count ?? 0) - i - 1])
}
let string = newStringArr.joined(separator: " ")
return string
}

不过将代码拷贝到 Playground(Xcode10 beta4)里面,代码是无法编译通过的。而且翻译的代码里,有很多桥接 OC 的地方,这简直是要逼死 Swifter 强迫症啊!

面对这种状况,肯定是不能轻易认输滴,来吧,手动模式走起。一段看似简单的代码,上手写的时候才发现,Swift 里对 String 相关的 API 改动确实是太大了,连写个完整的语句都困难了。这也怪我平时太眼高手低,哎!
眼看饭点已经过去,硬着头皮也要往下搞了。既然 API 改动大,不妨把 API 文档先过一遍。

一份外卖送到的时间,一套 Swifty 的代码就出炉了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 完全逆序 输入 "1234" 输出 "4321"
func invertString(_ s: String?) -> String? {
guard let str = s else {
return nil
}
var string = ""
let count = str.count

for i in 0..<count {
let idx = String.Index(encodedOffset: count - i - 1)
let char = str[idx]
string.append(char)
}

return string
}

// 单词逆序 输入"hello world" 输出"world hello"
func invertWord(_ s: String?) -> String? {
guard let str = s else {
return nil
}
let stringArr = str.components(separatedBy: " ")
var newStringArr: [String] = []
for i in 0..<(stringArr.count) {
newStringArr.append(stringArr[(stringArr.count) - i - 1])
}
let string = newStringArr.joined(separator: " ")
return string
}

其实 Swift 的代码风格是趋于简单化了,而且易读性也很好,增强了类型推断和可选类型,日后维护起来也会得心应手。

目前 Swift 的 API 基本已经完全脱离了OC的语法风格,使用工具简单的将OC代码转换成Swift代码的方式已经慢慢的行不通了。刚从OC转过来的同学估计会一脸懵逼,目前Swift发展已经趋于成熟,ABI估计一年内也可以稳定下来,平时多关注,用时不懵逼 🤣 。

传送门:Swift官方文档

------------- 本文结束感谢您的阅读 -------------