初级开发人员。我目前正在尝试实现将String的每n个字符分割成一个子字符串。
这是我的函数代码
public func split(every: Int) -> [String] {
var result = [String]()
for i in stride(from: 0, to: self.count, by: every) {
let startIndex = self.index(self.startIndex, offsetBy: i)
let endIndex = self.index(startIndex, offsetBy: every, limitedBy: self.endIndex) ?? self.endIndex
result.append(String(self[startIndex..<endIndex]))
}
return result
}
上面的代码按预期工作。但是上面的代码中缺少一个内容,即自动换行。这是示例字符串
let itemName = "Japanese Matcha SM w RB -L Special Edition And Americano MS w Brown Sugar Limited Edition"
print(itemName.split(every: 26))
结果将是
["Japanese Matcha SM w RB -L", " Special Edition And Ameri", "cano MS w Brown Sugar Limi", "ted Edition"]
注意
[" Special Edition And Ameri"], ["cano MS w Brown Sugar Limi"]
我试图找出如何基于每个n个字符进行自动换行算法,但是找不到任何线索。
例如,从上述情况来看,如何生成数组成为
[" Special Edition And"], ["Americano MS w Brown"], ["Sugar"]
因此,如您所见,该算法可能会检查每n个字符是否都有一个要切出的单词(基于n个字符的动态检查),因此会将切出的单词移到下一个数组中。
因此,在这种情况下,如果没有包装任何单词,该算法将巧妙地绕过每n个字符,该数量可以少于,但不超过n个字符。
我的解释清楚吗?谁能指导我?谢谢
答案 0 :(得分:1)
这是该算法的一些简单实现,您可以从此开始。 首先,我们将单词切成字符串,然后将它们添加到临时字符串中,直到达到字符数限制为止。
let itemName = "Japanese Matcha SM w RB -L Special Edition And Americano MS w Brown Sugar Limited Edition"
let table = itemName.split(separator: " ")
let limit = 26
var tempString = ""
var finalResult: [String] = []
for item in table {
tempString += item + " "
if tempString.count >= limit {
finalResult.append(tempString)
tempString = ""
}
}
print(finalResult)
答案 1 :(得分:0)
怎么样?
extension String {
func split(every: Int) -> [String] {
var result = [String]()
let words = self.split(separator: " ")
var line = String(words.first!)
words.dropFirst().forEach { word in
let word = " " + String(word)
if line.count + word.count <= every {
line.append(word)
} else {
result.append(line)
line = word
}
}
result.append(line)
return result
}
}