[Сравнение меток:]: непризнанный селектор, отправленный в экземпляр

#swift #core-data

Вопрос:

Мое приложение выходит из строя с ошибкой unrecognized selector sent to instance и просто выделяется @main в файле swift моего приложения, что не дает мне никаких подсказок относительно того, что может быть причиной ошибки.

Я думаю, что это может быть связано с конфликтующими данными в @fetchRequest. Я выделил ошибку в этих фрагментах кода:

 struct SidebarView: View {
    @Environment(.managedObjectContext) private var viewContext
    @FetchRequest(entity: Label.entity(), sortDescriptors: [NSSortDescriptor(keyPath: Label.name, ascending: true)])
    var labels: FetchedResults<Label>

    var body: some View {
        let allLabelNames = labels.map { "($0.value(forKeyPath: "name")!)" }
        let labelNames = allLabelNames.uniqued()

         VStack{
             NavigationLink(destination: AllDataView(names: labelNames)){
                Text("View all data")
         }
    }
}
 
 struct AllDataView: View {
    var imagesFetchRequest: FetchRequest<Sample>
    var images: FetchedResults<Sample>{
        imagesFetchRequest.wrappedValue
    }
    private var names: [String]

    init(names: [String]){
        let samplesSortDescriptor = NSSortDescriptor(keyPath: Sample.label, ascending: true)
        let predicate = NSPredicate(format: "label.name IN %@", names)
        self.names = names
        imagesFetchRequest = FetchRequest<Sample>(entity: Sample.entity(), sortDescriptors: [samplesSortDescriptor], predicate: predicate)
    }
}
 

Обратите внимание, что метка представляет собой NSManagedObject

Есть какие-нибудь идеи о том, как отладить эту проблему, чтобы найти точную строку в моем приложении, которая вызывает сбой?

Комментарии:

1. Выдайте полное сообщение об ошибке.

2. NSSortDescriptor(keyPath: Sample.label, ascending: true) => NSSortDescriptor(keyPath: Sample.label.name, ascending: true) ? Вы пытаетесь отсортировать по label свойству, которое является a Label . Таким образом, в какой-то момент он будет сравнивать Label экземпляр с другим , вызывая compare() , что в вашем случае не работает… Вы хотите сравнить по свойству name.

3. Спасибо @Larne! в этом-то и была проблема. если вы добавите это в качестве ответа, я отмечу его как правильный.

Ответ №1:

 NSSortDescriptor(keyPath: Sample.label, ascending: true) 
 

=>

 NSSortDescriptor(keyPath: Sample.label.name, ascending: true)
 

В первом случае вы пытаетесь выполнить сортировку Sample по свойству label ( Label ).
Так что в какой-то момент будет [someLabelInstance compare:someOtherLabelInstance] полезно узнать, какой из них нужно поставить перед другим. Но у Label него нет метода экземпляра compare() , поэтому вы получаете ошибку.
Вы хотите на самом деле отсортировать по name свойству этого label . Свойство, которое является String (неявным при чтении вашего кода) и является «сортируемым» (реализует compare() ).