Menggunakan data inti saya menyimpan beberapa bandara dan untuk setiap bandara saya menyimpan catatan yang berbeda

Saya telah membuat entitas Bandara dan entitas Briefing

Airport memiliki 1 atribut yang disebut icaoAPT dan Briefing memiliki 4 atribut kategori, descript, icaoAPT, noteID

Pada DetailView saya, saya menunjukkan daftar semua catatan yang terkait dengan bandara itu, saya berhasil memiliki pengambilan dinamis melalui tampilan lain yang disebut FilterList

import SwiftUI
import CoreData


struct FilterLIst: View {
    var fetchRequest: FetchRequest<Briefing>
    @Environment(\.managedObjectContext) var dbContext
    
    
    init(filter: String) {
        fetchRequest = FetchRequest<Briefing>(entity: Briefing.entity(), sortDescriptors: [], predicate: NSPredicate(format: "airportRel.icaoAPT == %@", filter))
        
    }
    func update(_ result : FetchedResults<Briefing>) ->[[Briefing]]{
        return Dictionary(grouping: result) { (sequence : Briefing)  in
            sequence.category
        }.values.map{$0}
        
    }
    

        
  
    var body: some View {
       
        List{
            ForEach(update(self.fetchRequest.wrappedValue), id: \.self) { (section : Briefing) in
                Section(header: Text(section.category!)) {
                    
                    ForEach(section, id: \.self) { note in
                        Text("hello") 
/// Xcode error Cannot convert value of type 'Text' to closure result type '_'
                    }
                }
            }
        }
    }
}

Pada tampilan ini saya mencoba menampilkan semua bagian yang dibagi berdasarkan kategori menggunakan pembaruan func ... tetapi Xcode memberi saya kesalahan ini, saya tidak mengerti mengapa..Tidak dapat mengonversi nilai tipe 'Teks' menjadi tipe hasil penutupan ' _'

Referensi depan saya daftar di bawah detail saya Lihat

import SwiftUI

struct DeatailsView: View {
    @Environment(\.managedObjectContext) var dbContext
    @Environment(\.presentationMode) var presentation
    @State var airport : Airport
    @State var note = ""
    @State var noteTitle = ["SAFTY NOTE", "TAXI NOTE", "CPNOTE"]
    @State var notaTitleSelected : Int = 0
    @State var notaID = ""

    
    
    
    var body: some View {
        Form{
            Section(header: Text("ADD NOTE Section")) {
                TextField("notaID", text: self.$notaID)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .padding()
                TextField("add Note descrip", text: self.$note)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                    .padding()
                
                Picker(selection: $notaTitleSelected, label: Text("Class of Note")) {
                    ForEach(0 ..< noteTitle.count) {
                        Text(self.noteTitle[$0])
                    }
                }
                HStack{
                    Spacer()
                    Button(action: {
                        let nota = Briefing(context: self.dbContext)
                        nota.airportRel = self.airport
                        nota.icaoAPT = self.airport.icaoAPT
                        nota.descript = self.note
                        nota.category = self.noteTitle[self.notaTitleSelected]
                        nota.noteID = self.notaID
                        
                        do {
                            try self.dbContext.save()
                            debugPrint("salvato notazione")
                            
                        } catch {
                            print("errore nel salva")
                        }
                    }) {
                        Text("Salva NOTA")
                    }
                    Spacer()
                }
            }
            
            Section(header: Text("View Note")) {
                FilterLIst(filter:  airport.icaoAPT ?? "NA")
            }
        }
    }
}

Terima kasih untuk bantuannya

4
Damiano Miazzi 4 Juli 2020, 12:15

1 menjawab

Jawaban Terbaik

Ini karena Anda mencoba mengulangi objek tunggal Briefing dan loop ForEach mengharapkan koleksi:

List {
    ForEach(update(self.fetchRequest.wrappedValue), id: \.self) { (section: Briefing) in
        Section(header: Text(section.category!)) {
            ForEach(section, id: \.self) { note in // <- section is a single object
                Text("hello")
                /// Xcode error Cannot convert value of type 'Text' to closure result type '_'
            }
        }
    }
}

Saya sarankan Anda untuk mengekstrak ForEach kedua ke metode lain untuk kejelasan. Dengan cara ini Anda juga dapat memastikan bahwa Anda memberikan argumen dengan tipe yang benar ([Briefing]):

func categoryView(section: [Briefing]) -> some View {
    ForEach(section, id: \.self) { briefing in
        Text("hello")
    }
}

Perhatikan bahwa hasil metode update Anda bertipe [[Briefing]], yang berarti parameter dalam ForEach adalah section: [Briefing] (dan bukan Briefing):

var body: some View {
    let data: [[Briefing]] = update(self.fetchRequest.wrappedValue)
    return List {
        ForEach(data, id: \.self) { (section: [Briefing]) in
            Section(header: Text("")) { // <- can't be `section.category!`
                self.categoryView(section: section)
            }
        }
    }
}

Ini juga berarti Anda tidak dapat menulis section.category! di header karena section adalah array.

Anda mungkin perlu mengakses objek Briefing untuk mendapatkan kategori:

Text(section[0].category!)

(jika Anda yakin elemen pertama ada).


Untuk kejelasan, saya menentukan tipe secara eksplisit. Ini juga merupakan cara yang baik untuk memastikan Anda selalu menggunakan jenis yang tepat.

let data: [[Briefing]] = update(self.fetchRequest.wrappedValue)

Namun, Swift dapat menyimpulkan tipe secara otomatis. Pada contoh di bawah ini, data akan bertipe [[Briefing]]:

let data = update(self.fetchRequest.wrappedValue)
2
pawello2222 4 Juli 2020, 10:18