Невозможно использовать пользовательский вид в SwiftUI

Для моего приложения SwiftUI я создал простой Title вид, который имеет заданный размер шрифта и цвет текста. Title объявляется следующим образом:

struct Title: View {
    var string: String

    var body: some View {
        Text(string)
            .font(.system(size: 32))
            .color(Color.black)
    }
}

У меня есть следующие текстовые объекты в теле моего представления содержимого прямо сейчас:

var body: some View {
    VStack(alignment: .leading) {
        Text("Welcome")
            .font(.largeTitle)
            .color(Color.black)
        Text("to SwiftUI")
            .font(.largeTitle)
            .color(Color.secondary)
    }
}

Итак, теперь я хочу заменить эти два Textс моим Titles:

var body: some View {
    VStack(alignment: .leading) {
        Title("Welcome")
        Title("to SwiftUI")
    }
}

После замены представлений я получаю некоторые, казалось бы, не связанные сообщения об ошибках из XCode, которые мешают компиляции приложения:

Статический член "ведущий" нельзя использовать в экземпляре типа "Горизонтальное выравнивание"

'(LocalizedStringKey) -> Текст' не может быть преобразовано в '(LocalizedStringKey, String?, Bundle?, StaticString?) -> Text'

"Шрифт" не конвертируется в "Шрифт?"

...и более. Возвращаясь к Text вместо Title "исправляет" проблемы.

Что интересно, у меня тоже есть кастом PrimaryButton посмотреть, что я смог добавить без проблем:

struct PrimaryButton: View {
    var title: String

    var body: some View {
        Button(action: { print("tapped") }) {
            Text(title)
                .font(Font.primaryButton)
                .offset(y: 1)
                .padding(.horizontal, 20)
                .padding(.vertical, 14)
        }
    }
}

... а затем используя его:

PrimaryButton(title: "Let's go")

Вопрос

Это просто бета-версия или я что-то упустил?

2 ответа

Решение

Вам нужно добавить string: на ваш Title() инициализатор:

var body: some View {
    VStack(alignment: .leading) {
        Title(string: "Welcome")
        Title(string: "to SwiftUI")
    }
}

Ошибки компиляции в настоящее время вводят в заблуждение и не находятся рядом с реальной проблемой.

Вы скучаете по string: param в инициализаторе. Пожалуйста, найдите обновленный код ниже:

var body: some View {
    VStack(alignment: .leading) {
        Title(string: "Welcome")
        Title(string: "to SwiftUI")
    }
}

FYI:
Я создал один пример приложения

// MARK - CustomView

struct ContentView : View {
    var body: some View {
        VStack{
            CustomView(aString: "First String")
            CustomView(aString: "Second String")
        }
    }
}

// MARK - CustomView

struct CustomView : View {
    var aString: String
    var body: some View {
        Text(aString)
    }
}

Сегодня, 01.10.2019, Swift подсказал заменить string: с участием. verbatim:.

Text(verbatim: "Pressure") работает сегодняText(string: "Pressure")вчера работал, но не сегодня. hth

Другие вопросы по тегам