Если мне позволят рассуждать в Smalltalk, где блоки являются объектами класса BlockClosure
, я бы предположил, что вы представляете свойство , которое вы хотите количественно определить как блок p
. [ 1121]
Для простоты предположим, что свойство зависит от одного параметра x
. Тогда p(x)
будет соответствовать выражению Smalltalk
p value: x
, которое оценивает блок p
, используя аргумент x
.
Таким образом, вы можете реализовать метод Smalltalk forAll:
в классе BlockClosure
как:
forAll: aCollection
aCollection do: [:x | (self value: x) ifFalse: [^false]].
^true
, который проверяет, что свойство p
, представленное блоком получателя, оценивается как true
] для всех элементов в aCollection
(вашей вселенной).
Если ваша вселенная не меняется (обычный случай в контексте проблемы), и какие изменения это свойство, вы можете определить класс Universe
, который будет содержать коллекцию элементов в своей переменной экземпляра [ 1115]. Затем вы можете реализовать в Universe
forAll: aProperty
^aProperty forAll: contents
, где внутреннее сообщение forAll:
- это сообщение, реализованное в BlockClosure
.
Вы можете использовать этот #define, чтобы изменить то, что вы строите для каждого SDK ...
#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2
// iPhone 3.0 code here
#endif
И сделать это во время выполнения, чтобы запустить код для 3.0 и выше:
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version >= 3.0)
{
// iPhone 3.0 code here
}
Это в опциях сборки Xcode. Раскрывающийся список в верхнем левом углу, который говорит что-то вроде «myapp - 3.0 | Debug» Выберите сборку, которую хотите, и нажмите «Готово».
Использование хитрости добавления OTHER_CFLAGS = «-g3 -save-temps -dD» из этого ответа я обнаружил, что определение __IPHONE_OS_VERSION_MIN_REQUIRED 20000 с проектом, нацеленным на 2.2.1. Возможно, это сработает?
Я вполне уверен, что комментарий к ОП подводит итог. Ты не можешь Потому что директива времени компиляции не может принимать решение во время выполнения. В Xcode, если вы нацелены на 3.0, он не будет работать на телефоне 2.2.1. Если вы нацелились на 2.2.1, он не скомпилируется, потому что у вас есть специальный код 3.0.
Единственное верное решение - две версии вашего приложения, одна из которых скомпилирована для 3.0, а другая для 2.2. 1.
Ну, мои два цента:
Как насчет создания вашего приложения с последней версией, скажем 3.0, чтобы вы могли использовать все новые и крутые API-интерфейсы, и указав цель развертывания как самую последнюю версию вы хотите поддержать, чтобы ребята, которые не потратили время на обновление своих устройств, все равно запустили ваше приложение. В этом случае, как показано выше, вам необходимо проверить наличие самой последней версии SDK и предоставить альтернативные функции для обеспечения обратной совместимости вашего приложения.
С уважением, Хардик