CoreStore: выборка, где связь содержится в массиве

#ios #swift #core-data #corestore

#iOS #swift #основные данные #corestore

Вопрос:

Я пытаюсь извлечь все объекты из класса Match , который Discipline содержится в массиве дисциплин.

Вот код для выборки, который не работает:

 let disciplines: [Discipline] = ...
try CoreStoreDefaults.dataStack.fetchAll(From<Match>().where(Where<Match>(.$discipline, isMemberOf: disciplines)))
 

Ошибка компилятора, которую я получаю, такова:

 Key path value type 'FieldContainer<Match>.Relationship<Discipline?>' cannot be converted to contextual type 'RelationshipContainer<Match>.ToOne<Discipline>'
 

Вот класс соответствия:

 final class Match: CoreStoreObject {
    @Field .Stored("date", dynamicInitialValue: { Date() })
    var date: Date

    @Field .Stored("winnersPoints")
    var winnersPoints: Double = 0

    @Field .Stored("loosersPoints")
    var loosersPoints: Double = 0

    @Field .Relationship("discipline")
    var discipline: Discipline?

    @Field .Relationship("winners")
    var winners: [Player]

    @Field .Relationship("loosers")
    var loosers: [Player]
}
 

Вот класс Disciple:

 final class Discipline: CoreStoreObject {
    @Field .Stored("name")
    var name: String = ""

    @Field .Relationship("matches", inverse: .$discipline)
    var matches: [Match]
}
 

Что именно я здесь делаю не так?

Ответ №1:

Я также ответил на ваш вопрос в разделе проблем с CoreStore.

В инициализаторах отсутствовала перегрузка Where , которую я добавлю в следующем обновлении, но вы также можете использовать ~= оператор в качестве сокращенного синтаксиса:

 try CoreStoreDefaults.dataStack.fetchAll(
    From<Match>()
        .where(disciplines ~= .$discipline)
)