Протокол вывода строк для стандартного представления SwiftUI

Я столкнулся с вопросом, существуют ли какие-либо протоколы для указания универсального типа в SwiftUI, который будет отображаться в виде текста в Text представлении.

import SwiftUI

struct GenericTextView<A: DeclarationInQuestion>: View {
    var printableInstance: A
    
    var body: some View {
        Text("\(printableInstance)")
    }
}

struct GenericTextView_Previews: PreviewProvider {
    static var previews: some View {
        GenericTextView(printableType: Int(1))
    }
}

Если есть решение, как я буду определять и объявлять A?


person Jack B. Erger    schedule 13.09.2020    source источник


Ответы (1)


Это зависит от того, пытаетесь ли вы отобразить переданное значение или пытаетесь отобразить локализованную строку для переданного ключа. Похоже, вы пытаетесь отобразить переданное значение, но ваш код вызывает инициализатор для ключа локализации. Вероятно, вы захотите использовать Text(verbatim:):

struct GenericTextView<A>: View {
    var printableInstance: A

    var body: some View {
        Text(verbatim: "\(printableInstance)")
    }
}

Тем не менее, я бы не стал так писать. Нет причин для перенастройки значения таким образом. Вы можете просто преобразовать его в строку один раз и избежать общего:

struct GenericTextView: View {
    var string: String

    init<Value>(_ value: Value) {
        string = "\(value)"
    }

    var body: some View {
        Text(verbatim: string)
    }
}

Этот подход также позволяет использовать ключи локализации, просто отбрасывая verbatim:.

person Rob Napier    schedule 13.09.2020