Ключевой путь выражения деривации основных данных использует оператор в качестве промежуточного компонента

Я пытаюсь написать выражение вывода для суммы атрибута отношения ко многим.

У меня есть товар и группа, у товара есть цена и общая цена (сумма * цена). Я хочу написать выражение для общей цены группы в виде суммы ее составляющих.

введите здесь описание изображения

Когда я строю, я получаю сообщение об ошибке

ошибка: неверно сконфигурированное свойство: путь ключа LAEItemGroup.totalPrice «[email protected]» использует оператор в качестве промежуточного компонента

согласно документации и WWDC 2019 Создание приложений с основными данными должна быть возможность получить сумму по отношению ко многим.

Может кто-нибудь, пожалуйста, помогите мне найти правильный синтаксис или способ сделать это.

В качестве обходного пути я попытался написать переменную, которая работала в этом классе, так что

@objc
public var totalPrice: Double {
    value(forKeyPath: "[email protected]") as? Double ?? 0
}

так почему значение KeyPath работает, но не в редакторе модели?


person zombie    schedule 07.07.2020    source источник
comment
Вы пробовали items.totalPrice.@sum? Стоит попробовать, учитывая сообщение об ошибке.   -  person pbasdf    schedule 07.07.2020


Ответы (3)


Теперь у меня была возможность проверить. Похоже, что формат, используемый редактором модели, предназначен для того, чтобы агрегатный оператор находился в конце выражения (которое, как вы указываете, отличается от формата, используемого в других выражениях):

items.totalPrice.@sum
person pbasdf    schedule 07.07.2020
comment
выражение общего количества элементов, записанное как price * amount, вызывает исключение при создании контейнера хранилища exception: currently unsupported (too many keypaths) как вы думаете, это связано с той же причиной и где я могу найти больше о том, как написать правильный синтаксис - person zombie; 08.07.2020
comment
Когда я делаю это за сумму, я получаю *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'currently unsupported (unsupported function on to many (not count or sum))'. Есть идеи, почему? - person alpennec; 09.11.2020

Используйте items.totalPrice.@sum в качестве выражения производного свойства в редакторе модели Xcode.

Это работает только для числовых типов? У меня есть свойство maxDate с производным выражением свойства

items.createdAt.@max

Он компилируется, но выдает ошибку во время выполнения:

'NSInvalidArgumentException', reason: 'currently unsupported (too many steps)

Где Date — тип данных для createdAt

person spnkr    schedule 26.07.2020
comment
Я видел это исключение несколько раз, что я не мог обновить свой код, чтобы использовать его, я надеюсь, что это будет улучшено. - person zombie; 26.07.2020
comment
@max не поддерживается. Только @count и @sum. Но когда я пытаюсь сделать items.totalPrice.@sum, у меня возникает следующий сбой: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'currently unsupported (unsupported function on to many (not count or sum))'. Есть идеи, почему? - person alpennec; 09.11.2020

Я только что закончил лабораторную работу WWDC Core Data с Риши, который помог мне с этим! Вы должны использовать sum:(items.totalPrice) вместо синтаксиса .@sum. Синтаксис со скобками также можно использовать для некоторых других функций (например, count:(items) (количество элементов в отношении ко многим) или max:(items.createdAt) (дата самого последнего элемента)).

person halleygen    schedule 11.06.2021
comment
Спасибо, вы знаете, если мы вложим эти функции или пойдем на два уровня глубже в отношениях? - person zombie; 11.06.2021
comment
@zombie Нет, я так не думаю. В выступлении на WWDC19 (около 19:58), где они представляют производные атрибуты, они говорят, что выражения деривации могут относятся к любому из свойств сущности, на один уровень в глубину. - person halleygen; 23.07.2021