使用 while 循环的解决方案实际上比使用 stride 的解决方案更灵活一些。这是亚当回答的一个小更新(Swift 5):
extension String {
func split(len: Int) -> [String] {
var currentIndex = 0
var array = [String]()
let length = self.count
while currentIndex < length {
let startIndex = index(self.startIndex, offsetBy: currentIndex)
let endIndex = index(startIndex, offsetBy: len, limitedBy: self.endIndex) ?? self.endIndex
let substr = String( self[startIndex...endIndex] )
array.append(substr)
currentIndex += len
}
return array
}
}
我们可以将它概括为一个 Int 数组而不是单个 Int。这样我们就可以将一个字符串拆分成不同长度的子字符串,如下所示:
extension String {
func split(len: [Int]) -> [String] {
var currentIndex = 0
var array = [String]()
let length = self.count
var i = 0
while currentIndex < length {
let startIndex = index(self.startIndex, offsetBy: currentIndex)
let endIndex = index(startIndex, offsetBy: len[i], limitedBy: self.endIndex) ?? self.endIndex
let substr = String( self[startIndex..<endIndex] )
array.append(substr)
currentIndex += len[i]
i += 1
}
return array
}
}
用法:
func testSplitString() throws {
var retVal = "Hello, World!".split(len: [6, 1, 6])
XCTAssert( retVal == ["Hello,", " ", "World!"] )
retVal = "Hello, World!".split(len: [5, 2, 5, 1])
XCTAssert( retVal == ["Hello", ", ", "World", "!"] )
retVal = "hereyouare".split(len: [4, 3, 3])
XCTAssert( retVal == ["here", "you", "are"] )
}