Как математик, я бы сказал, что цвет является основным в том и только в том случае, если он является членом набора {красных, зеленых, синих} основных цветов.
И это именно то, что вы могли бы сказать в Delphi:
isPrimary := Colour in [clRed, clGreen, clBlue]
На самом деле, я использую эту технику очень часто. В прошлый раз было три дня назад. Реализуя свой собственный интерпретатор языка сценариев, я написал
const
LOOPS = [pntRepeat, pntDoWhile, pntFor];
, а затем в несколько строк
if Nodes[x].Type in LOOPS then
@supercat, и т.д. («Что касается того, почему никто этого не сделал, я не знаю».):
Вероятно, потому, что разработчики языков программирования - математики (или, по крайней мере, математически склонные). Если математику нужно установить равенство двух объектов, она естественным образом скажет
X = Y,
. Но если X может быть одной из множества вещей A, B, C, ..., тогда она определит набор S = {A, B, C, ...}
этих вещей и напишет
X ∈ S.
Действительно, это чрезвычайно распространено, что вы (математики) пишете X ∈ S
, где S - это множество
S = {x ∈ D; P(x)}
объектов в некоторой вселенной D, обладающих свойством P, вместо записи P(X)
. Например, вместо того, чтобы сказать «x является положительным действительным числом» или «PositiveReal (x)», можно сказать x ∈ ℝ⁺
.
Я мог бы полностью удалить привязки из уравнения и создать свои собственные ошибки при возникновении проблем с проверкой, но я чувствую, что таким образом выбрасываю некоторые полезные вещи.
Вы можете использовать NSUnderlyingErrorKey
, чтобы обернуть одну ошибку (объект для этого ключа) в другую ошибку (ту, чья userInfo
содержит этот ключ).
Единственный другой вариант, который я вижу, - это удаление NSFormatter. уравнения и использование validateValue: forKey: error: в моих управляемых объектах Core Data для обработки проверки. Для меня это не так много смысла, как использование средства форматирования, но, по крайней мере, у меня был бы полный контроль над объектом NSError.
Это два отдельных уровня, и они не исключают друг друга. Проверка средства форматирования находится на уровне представления; проверка значения ключа (в данном случае в ваших управляемых объектах) находится на уровне модели.
Если рассматриваемая проверка должна происходить на уровне представления, создайте подкласс своего класса NSFormatter (если вы еще этого не сделали) и реализуйте getObjectValue: forString: errorDescription:
, чтобы получить более конкретное описание ошибки. (Я не знаю, действительно ли Bindings использует это описание ошибки. Вы должны проверить.)
Если проверка должна происходить на уровне модели, реализуйте validate
(единственный -property версия validateValue: forKey: error:
) в вашем подклассе NSManagedObject.
Если одни из ограничений находятся на уровне модели, а другие - на уровне представления, сделайте и то, и другое. Вы можете реализовать некоторые проверки в модуле форматирования и другие проверки в модели, если это имеет смысл для вашего приложения и ваших проверок.