Swift

Swift4 字符串截取

2017-09-06  本文已影响1500人  囧书

What

现有字符串Hello, World!

let helloWorld = "Hello, World!"

想截取前5个字符为子串,一句话写出来,可以这样:

let subStringTo5 = String(helloWorld[..<helloWorld.index(helloWorld.startIndex, offsetBy: 5)])
print("subStringTo5: \(subStringTo5)")

打印结果:
subStringTo5: Hello

Why

要对String操作,大多需要通过String.Index为中间媒介来达到。
对于截取字符串,Swift4用的是[startIndex...endIndex]这样的语法,在String后跟一个区间。通俗讲,此区间的值要求用String.Index类型,下面我们来弄出一些Index值。

起始Index:

let startIndex = helloWorld.startIndex

在起始Index基础上偏移5:

let offset5Index = helloWorld.index(startIndex, offsetBy: 5)

在中括号里写两个值,可以得到一个子串,结果是SubString类型。
这种写法...是闭区间,得到结果包括左右两个Index对应的字符;
这种写法..<是开区间,得到结果包括了左Index对应的字符,但不包括右Index对应的字符:

let subString = helloWorld[startIndex..<offset5Index]

如果左Index不写,则默认为startIndex:

let subString = helloWorld[..<offset5Index]

以上得到的结果,类型还不是String,只是SubString类型而已,还需要我们多做一步工作,构造String :

let subStringTo5 = String(helloWorld[..<offset5Index])
print("subStringTo5: \(subStringTo5)")

打印结果:
subStringTo5: Hello

如果在中括号里只写一个Index值会怎么样?得到的结果是所写Index对应的字符,Character类型:

let offset5Character = helloWorld[offset5Index]
print("offset5Character: \(offset5Character)")

打印结果,是个逗号:
offset5Character: ,

How

如果觉得Swift4这样设计,不习惯,那么还是可以通过extension的方式,自己实现一个喜欢的subString方法。

extension String {
    func mySubString(to index: Int) -> String {
        return String(self[..<self.index(self.startIndex, offsetBy: index)])
    }
    
    func mySubString(from index: Int) -> String {
        return String(self[self.index(self.startIndex, offsetBy: index)...])
    }
}

使用:

print("subStringTo8: \(helloWorld.mySubString(to: 8))")
print("subStringFrom5: \(helloWorld.mySubString(from: 5))")

打印结果:
subStringTo8: Hello, W
subStringFrom5: , World!

上一篇 下一篇

猜你喜欢

热点阅读