Untuk beberapa alasan, saya mendapatkan kesalahan "SGNL SGBRT" di mana saya menetapkan nilai pada predikat. Apa alasannya dan bagaimana saya bisa mengatasi masalah ini?

struct SearchView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest var reminder: FetchedResults<CDReminder>
    @Binding var searchText: String

init(searchText: Binding<String>) {
    self._searchText = searchText
    var predicate : NSPredicate?
    predicate = NSPredicate(format: "name CONTAINS %@", searchText as! CVarArg) // SGNL SGBRT ERROR
    self._reminder = FetchRequest(
        entity: CDReminder.entity(),
        sortDescriptors: [],
        predicate: predicate
        )
}
    var body: some View {
        VStack{
            SearchBar(text: $searchText)
                .environment(\.managedObjectContext, viewContext)
            List{
                ForEach(reminder, id: \.self){ reminder in
                    DatedReminderCell(reminder: reminder, isSelected: false, onComplete: {})
                }
            }
        }
    }
}
0
Mert Köksal 12 Mei 2021, 12:09

1 menjawab

Jawaban Terbaik

Pembungkus properti @Binding memiliki semantik berikut:

  • self._searchText (sama seperti $searchText) mewakili struct Binding<String>, pengikatan dua arah.
  • self.searchText (sama seperti self._searchText.wrappedValue) mewakili nilai string yang dibungkus.

Ini sedikit mirip dengan enum String RawRepresentable. Anda memerlukan rawValue daripada kasus enum.

Jadi sintaks yang benar adalah

predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)

Atau

predicate = NSPredicate(format: "name CONTAINS %@", self._searchText.wrappedValue)

Karena String sesuai dengan protokol CVArg, gips (jembatan) tidak diperlukan. Bagaimanapun juga, cast kekuatan salah.

1
vadian 12 Mei 2021, 09:34