SwiftUI: конкатенация текстовых представлений, как это сделать с помощью ForEach l oop или массива строк - PullRequest
0 голосов
/ 10 января 2020

Мне нужно объединить Text() представлений в SwiftUI, используя + оператор

Я пробовал что-то подобное

Text("\(feed.author?.firstName ?? "") \(feed.author?.lastName ?? "") ")
                    .font(.custom("AvenirNext-Medium", size: 15))
                    .foregroundColor(.black)


                ForEach(feed.titleChunks, id: \.self) { chunk in
                    + Text("\(chunk)")
                    .font(.custom("AvenirNext-Regular", size: 15))
                    .foregroundColor(Color("BodyText"))
                }

Но это, конечно, не работает. Есть ли способ получить массив строк с неизвестным количеством элементов, напечатанных с использованием текста, чтобы он формировал единое текстовое представление в SwiftUI, как это делает

Text("1") + Text("2") + Text("3")?

Есть ли какое-то решение для Эта проблема. Я устал стати c подход, и это работает, но я не знаю заранее, сколько текста () у меня

Text("\(feed.author?.firstName ?? "") \(feed.author?.lastName ?? "") ")
                    .font(.custom("AvenirNext-Medium", size: 15))
                    .foregroundColor(.black)

                + Text("\(feed.titleChunks[0])")
                .font(.custom("AvenirNext-Regular", size: 15))
                .foregroundColor(Color("BodyText"))
                + Text("\(feed.titleChunks[1])")
                .font(.custom("AvenirNext-DemiBold", size: 15))
                .foregroundColor(Color("BodyText"))

Ответы [ 2 ]

4 голосов
/ 10 января 2020

ForEach весьма запутанно - это не все oop, а ViewBuilder

Что вам нужно, это reduce. Документы описывают это как:

Используйте метод Reduce (: :), чтобы получить одно значение из элементов всей последовательности. Например, вы можете использовать этот метод на массиве чисел, чтобы найти их сумму или произведение.

В контексте SwiftUI вы можете использовать его следующим образом:

let words = ["This", "is", "an", "example"]

var body: some View {
    words.reduce(Text(""), { $0 + Text($1) + Text(" ")} )
}
1 голос
/ 10 января 2020

Я нашел решение, используя метод или другое представление, и собрал конкатенацию текста, используя var output : Text переменную

  var output = Text("")

        let author = Text("\(feed.author?.firstName ?? "") \(feed.author?.lastName ?? "") ")
                    .font(.custom("AvenirNext-Medium", size: 15))
                    .foregroundColor(.black)

        output = output + author

        for chunk in feed.titleChunks {

            let chunkText : Text
            if chunk.first == "#" {
                chunkText = Text("\(chunk)")
                .font(.custom("AvenirNext-DemiBold", size: 15))
                .foregroundColor(Color("BodyText"))
            } else {
                chunkText = Text("\(chunk)")
                .font(.custom("AvenirNext-Regular", size: 15))
                .foregroundColor(Color("BodyText"))
            }

            output = output + chunkText
        }

        return output
...