NSP Предикат в качестве решателя ограничений? - PullRequest
4 голосов
/ 02 марта 2010

Я работаю над проектом, который включает в себя несколько более сложную динамическую компоновку элементов интерфейса, чем я привык. Я всегда чувствую себя глупо, когда пишу сложный код, который проверяет, близок ли тот-то к такому-то-то-то-то-то-другому уровню, и в этом случае он перемещается на x% в каком-то направлении и т. Д. Это просто не так, как программирование. Программирование должно быть как можно более декларативным!

Именно потому, что то, что я собираюсь сделать, довольно просто, я подумал, что это хорошая возможность попробовать что-то новое, и я подумал об использовании NSPredicate в качестве простых ограничений. решатель . До сих пор я использовал NSPredicate только для очень простых задач, но я знаю, что он способен на гораздо большее.

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

Я приведу очень простой пример, чтобы было что-то конкретное, чтобы ответить. Как я могу использовать NSPredicate для решения следующих ограничений:

viewB.xmid = (viewB.leftEdge + viewB.width) / 2
viewB.xmid = max(300, viewA.rightEdge + 20 + viewB.width/2)

("viewB должен быть горизонтально центрирован по координате 300, если только его левый край не попадает в пределах 20 пикселей от правого края viewB, и в этом случае левый край viewA должен оставаться фиксированным на уровне 20 пикселей справа от правого края viewB и горизонтального центра viewA толкаться вправо. ")

viewA.rightEdge и viewB.width могут различаться, и это «входные переменные».

РЕДАКТИРОВАТЬ: Любое решение, вероятно, придется использовать NSExpression метод -(id)expressionValueWithObject:(id)object context:(NSMutableDictionary *)context. Этот ответ актуален.

Ответы [ 2 ]

1 голос
/ 09 марта 2010

Предикаты какао по сути являются своего рода SQL для какао. Большая их сила заключается в их способности выполнять поиск и сравнение строк и не иметь никаких дополнительных (полезных) возможностей для того, что вы пытаетесь сделать, а именно (насколько я могу судить) числовые сравнения. Я не думаю, что они делают для очень поддерживаемого кода либо.

Регулярные логические выражения функционально эквивалентны предикатам Какао, и вы можете перераспределить их и назначить их умело названным переменным.

if (viewAIs20PixelsAway && viewBIs30PixelsAway) {
    [viewA moveToPositionA];
} else ...

(Очень упрощенный пример ... Я мог бы придумать что-нибудь получше.)

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

0 голосов
/ 11 марта 2010

Решение простых линейных уравнений с помощью NSPredicate (и NSExpression) - дело простое, но переход от него к решению произвольных наборов ограничений (иначе говоря, линейное программирование) - все еще большой шаг.Самый многообещающий путь вперед - это сделать то, что предлагает Крис Хэнсон , и обновить его BDRuleEngine .Веселый проект на черный день.

...