Ошибка SwiftUI: «Вид». Тип «не может быть преобразован в» (строка, строка, строка, глиф) -> «Вид» - PullRequest
1 голос
/ 19 марта 2020

Первый проект SwiftUI :) У меня есть NavLink из списка в представлении верхнего уровня, которое вызывает подробное представление. это работало до тех пор, пока мне не понадобилось добавить переменную @State Struct в подробное представление, теперь список параметров вызова не соответствует ожидаемому компилятором:

    ZStack {
        VStack {
            NavigationView {
                    List(gList) { gard in
                        NavigationLink(destination:
                            SelectGlyph(catList: gard.category,
                                        firstGlyph: gard.ex1,
                                        descr: gard.title,
                                        selectedGlyph: Glyph() )
                        {

и подробное представление начинается:

struct SelectGlyph: View {
    var catList: String
    var firstGlyph: String
    var descr: String
    @State var selectedGlyph:Glyph = Glyph()

    var body: some View {
        ZStack{
            VStack() {
                VStack {
                    VStack {
                        VStack {

и структура глифа определяется как:

struct Glyph: Codable, Identifiable, Equatable {
    var id:String {
        return Gardiner
    }
    var Hieroglyph: String
    var Gardiner: String
    let Unicode: String
    let Description: String
    let Transliteration: String
    let Phonetic: String
    let Notes: String

    init() {
        self.Hieroglyph = ""
        self.Gardiner = ""
        self.Unicode = ""
        self.Description = ""
        self.Transliteration = ""
        self.Phonetic = ""
        self.Notes = ""
    }

    init(Hiero:String, Gard:String, Uni:String, Desc:String, trans:String, phon:String, notes:String) {
        self.Hieroglyph = Hiero
        self.Gardiner = Gard
        self.Unicode = Uni
        self.Description = Desc
        self.Transliteration = trans
        self.Phonetic = phon
        self.Notes = notes
    }
}

Ошибка находится на верхнем уровне ContentView navLink Место назначения:

'SelectGlyph.Type' is not convertible to '(String, String, String, Glyph) -> SelectGlyph'

Я пробовал несколько вариантов в списке вызовов и попытался удалить обертку @State в SelectGlyph, все безрезультатно. Любая помощь будет оценена! Было бы неплохо, если бы я знал, как указать локальную переменную в View, не являясь обязательным аргументом в вызове (я уверен, что я что-то здесь упустил!)

В ответ на Asperi я попробовал явный инициализатор для представления SelectGlyph и все еще получил ту же ошибку в том же месте:

struct ContentView: View {
    var gList: [GardinerList] = gardinerTest
    var body: some View {
        UINavigationBar.appearance().backgroundColor = .yellow
            return
        ZStack {
            VStack {
                NavigationView {
                        List(gList) { gard in
                            NavigationLink(destination:
                                SelectGlyph(catList: gard.category,  <- Error Here
                                            firstGlyph: gard.ex1,
                                            descr: gard.title,
                                            selectedGlyph: Glyph() )
                            {
                            Text(gard.category)
                                .fontWeight(.bold)
                                .foregroundColor(Color.green)

с представлением SelectGlyph, теперь измененным, чтобы иметь явный init (). Я попытался указать selectedGlyph в init () как _selectedGlyph и как self._selectedGlyph

struct SelectGlyph: View {
    var catList: String
    var firstGlyph: String
    var descr: String
    @State private var selectedGlyph:Glyph = Glyph()

    init(catList: String, firstGlyph: String, descr: String, selectedGlyph:Glyph) {
        self.catList = catList
        self.firstGlyph = firstGlyph
        self.descr = descr
        self._selectedGlyph = State<Glyph>(initialValue: selectedGlyph)
    }

    var body: some View {
        ZStack{
            VStack() {

1 Ответ

1 голос
/ 19 марта 2020

Именно здесь

                NavigationLink(destination:
                    SelectGlyph(catList: gard.category,
                                firstGlyph: gard.ex1,
                                descr: gard.title,
                                selectedGlyph: Glyph() )

вам нужен явный инициализатор, например

struct SelectGlyph: View {
    var catList: String
    var firstGlyph: String
    var descr: String

    @State private var selectedGlyph:Glyph // << always keep @State private !!

    init(catList: String, firstGlyph: String, descr: String, selectedGlyph:Glyph) {
        self.catList = catList
        self.firstGlyph = firstGlyph
        self.descr = descr
        _selectedGlyph = State<Glyph>(initialValue: selectedGlyph)
    }

Обновление: Еще один. Если это не опечатка, то вы пропустили ')' в NavigationLink

NavigationLink(destination:
    SelectGlyph(catList: gard.category,
                firstGlyph: gard.ex1,
                descr: gard.title,
                selectedGlyph: Glyph() )) // << here !!
{
...