Swift4 字符串截取

现有字符串Hello, World!

let helloWorld = "Hello, World!"

想截取前5个字符为子串,有两种方法,一是使用字符串的集合特性:

let subStringTo5 = String(helloWorld.prefix(5))

二是使用字符串索引:

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

打印结果:
subStringTo5: Hello

要对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: ,

如果觉得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!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容