Ios SwiftUI:在同一行上组合文本

Ios SwiftUI:在同一行上组合文本,ios,iphone,xcode,swiftui,Ios,Iphone,Xcode,Swiftui,我正在编写的SwiftUI应用程序有大量的文本块,因此我正在尝试创建一种“标记语言”,我可以在保存文本的JSON文件中使用它来定义单词何时应该加粗。问题是,我似乎无法阻止新文本块转到另一行 以下是我目前拥有的相关代码 struct formattedText: View { var text: String var body: some View { let split = text.components(separatedBy: "**") Group {

我正在编写的SwiftUI应用程序有大量的文本块,因此我正在尝试创建一种“标记语言”,我可以在保存文本的JSON文件中使用它来定义单词何时应该加粗。问题是,我似乎无法阻止新文本块转到另一行

以下是我目前拥有的相关代码

struct formattedText: View {
var text: String

var body: some View {
    let split = text.components(separatedBy: "**")
    Group {
        ForEach(split, id: \.self) { line in
            if line.hasPrefix("$$") {
                Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
                    .bold()
            } else {
                Text(line)
            }
        }
    }
    .lineLimit(nil)
    .multilineTextAlignment(.leading)
}
使用此代码,我可以将
***$
放在单词前面,将
***
放在后面,将其定义为粗体

唯一的问题是每次我加粗一个词,它就会转到一个新行。我知道解决这个问题的传统方法是:

Text("Simple ") + Text("Swift ") + Text("Guide")

但这不适用于我的ForEach循环。有什么建议吗?

ForEach
创建单独的视图。您实际上只需要一个文本,因此您指的是循环中…的

var body: some View {
    let split = text.components(separatedBy: "**")
    var result = Text("")
    for line in split {
        if line.hasPrefix("$$") {
            result = result + Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
                .bold()
        } else {
            result = result + Text(line)
        }
    }

    return result
        .lineLimit(nil)
        .multilineTextAlignment(.leading)
}

由于您可能需要的不仅仅是粗体,您可能会发现将该部分提取到自己的函数或函数集合中非常有用:

private func applyAttributes(line: String) -> Text {
    if line.hasPrefix("$$") {
        return Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
            .bold()
    } else {
        return Text(line)
    }
}
因此,构建此模型更为简单:

var body: some View {
    text.components(separatedBy: "**")
        .map(applyAttributes)
        .reduce(Text(""), +)
        .lineLimit(nil)
        .multilineTextAlignment(.leading)
}

ForEach
创建单独的视图。您实际上只需要一个文本,因此您指的是循环中…的

var body: some View {
    let split = text.components(separatedBy: "**")
    var result = Text("")
    for line in split {
        if line.hasPrefix("$$") {
            result = result + Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
                .bold()
        } else {
            result = result + Text(line)
        }
    }

    return result
        .lineLimit(nil)
        .multilineTextAlignment(.leading)
}

由于您可能需要的不仅仅是粗体,您可能会发现将该部分提取到自己的函数或函数集合中非常有用:

private func applyAttributes(line: String) -> Text {
    if line.hasPrefix("$$") {
        return Text(line.trimmingCharacters(in: CharacterSet(charactersIn: "$")))
            .bold()
    } else {
        return Text(line)
    }
}
因此,构建此模型更为简单:

var body: some View {
    text.components(separatedBy: "**")
        .map(applyAttributes)
        .reduce(Text(""), +)
        .lineLimit(nil)
        .multilineTextAlignment(.leading)
}

明亮的工作得很好。非常感谢。明亮的工作得很好。非常感谢。