Swift 如何将字符串包装为72个字符

Swift 如何将字符串包装为72个字符,swift,string,Swift,String,我正在尝试将字符串的文本拆分为不超过72个字符的行(将行打断为通常的Usenet引用行长度)。除法应该通过用新行替换空格来完成(选择最接近的空格,这样每行都是。在其他语言中,你可以用整数索引字符串。在Swift中不是这样:你必须与它的字符索引交互,如果你不熟悉它,这可能会让你头疼 试试这个: private func split(line: Substring, byCount n: Int, breakableCharacters: [Character]) -> String {

我正在尝试将字符串的文本拆分为不超过72个字符的行(将行打断为通常的Usenet引用行长度)。除法应该通过用新行替换空格来完成(选择最接近的空格,这样每行都是。在其他语言中,你可以用整数索引字符串。在Swift中不是这样:你必须与它的字符索引交互,如果你不熟悉它,这可能会让你头疼

试试这个:

private func split(line: Substring, byCount n: Int, breakableCharacters: [Character]) -> String {
    var line = String(line)
    var lineStartIndex = line.startIndex

    while line.distance(from: lineStartIndex, to: line.endIndex) > n {
        let maxLineEndIndex = line.index(lineStartIndex, offsetBy: n)

        if breakableCharacters.contains(line[maxLineEndIndex]) {
            // If line terminates at a breakable character, replace that character with a newline
            line.replaceSubrange(maxLineEndIndex...maxLineEndIndex, with: "\n")
            lineStartIndex = line.index(after: maxLineEndIndex)
        } else if let index = line[lineStartIndex..<maxLineEndIndex].lastIndex(where: { breakableCharacters.contains($0) }) {
            // Otherwise, find a breakable character that is between lineStartIndex and maxLineEndIndex
            line.replaceSubrange(index...index, with: "\n")
            lineStartIndex = index
        } else {
            // Finally, forcible break a word
            line.insert("\n", at: maxLineEndIndex)
            lineStartIndex = maxLineEndIndex
        }
    }

    return line
}

func split(string: String, byCount n: Int, breakableCharacters: [Character] = [" "]) -> String {
    precondition(n > 0)
    guard !string.isEmpty && string.count > n else { return string }

    var string = string
    var startIndex = string.startIndex

    repeat {
        // Break a string into lines.
        var endIndex = string[string.index(after: startIndex)...].firstIndex(of: "\n") ?? string.endIndex
        if string.distance(from: startIndex, to: endIndex) > n {
            let wrappedLine = split(line: string[startIndex..<endIndex], byCount: n, breakableCharacters: breakableCharacters)
            string.replaceSubrange(startIndex..<endIndex, with: wrappedLine)
            endIndex = string.index(startIndex, offsetBy: wrappedLine.count)
        }

        startIndex = endIndex
    } while startIndex < string.endIndex
    return string
}

let str1 = "Iragvzvyn vzzntvav chooyvpngr fh Vafgntenz r pv fbab gnagvffvzv nygev unfugnt, qv zvabe fhpprffb, pur nttertnab vzzntvav pba y’vzznapnovyr zntyvrggn"
let str2 = split(string: str1, byCount: 72)
print(str2)
private func split(行:子字符串,按计数n:Int,breakableCharacters:[字符])->String{
变量行=字符串(行)
var lineStartIndex=line.startIndex
而line.distance(从:lineStartIndex到:line.endIndex)>n{
设maxLineEndIndex=line.index(lineStartIndex,偏移量:n)
如果breakableCharacters.contains(第[maxLineEndIndex]行){
//如果行终止于可断字符,则用换行符替换该字符
line.replaceSubrange(maxLineEndIndex…maxLineEndIndex,带“:”\n“)
lineStartIndex=line.index(在:maxLineEndIndex之后)
}如果let index=line[lineStartIndex..String{
前提条件(n>0)
guard!string.isEmpty&&string.count>n else{return string}
变量字符串=字符串
var startIndex=string.startIndex
重复{
//把一根绳子分成几行。
var endIndex=string[string.index(在:startIndex之后)…].firstIndex(共:“\n”)??string.endIndex
如果string.distance(从:startIndex到:endIndex)>n{

让wrappedLine=split(行:string[startIndex..Duplicate of?只需选择一个宽度,让文本系统为您包装。感谢您的评论Matt,非常有用。作为一名初学者,我不太了解Objective-C,我也不太了解所提供的示例中使用的方法。您是否有关于Swift的线索?提前谢谢。您想不想尝试一下吗(即使将一个单词分成多行,也要将每行精确设置为72个字符)或按空格分隔(选择最接近的空格,这样每一行代码都是不同的,我想用空格来分隔。哦,我明白了。我仍然认为链接的问题和答案是你需要的那种。如果你让文本工具包以单空格字体,以已知的72倍于字符宽度的宽度,将文本包装,它将自动只包装wa如果需要,您可以找出每行文本的范围,并在每个范围的开头插入一个返回字符。感谢您编写不同的代码,这是一个真正完整的问题解决方案。您好,编写不同的代码,您的函数在我第一次使用它时运行良好,但我注意到,如果我在已处理的文本中再次使用它,它将处理文本同样,我也在游戏场地上用它的输出来测试它,它把已经短路的线拆开了。嗯…好问题。它不考虑已经存在的断线。你可以用新的线分割字符串,然后单独处理每一行。我现在不在Mac上。请看一看,谢谢你的建议。我会处理的。s每一行。顺便说一句,我看到在某些情况下,处理后的最后一行可能有超过72个字符。例如,处理此文本后,最后一行有79个字符:“Iragvvzvyn vzzntvav chooyvpngr fh Vafgnentez r pv fbab gnagvffvzv nygev unfugnt,qv zvabe fhpprffb,pur nttertnab vzzntvav pba y'vzznapnovyr zntyvrggn。”可能是什么?更新了我的答案,使其更加健壮