Самое простое решение, которое я могу придумать, которое не требует создания собственного модуля (или изменения существующего), состоит в том, чтобы передать этот параметр в качестве свойства реагирующего компонента.
В вашем AppDelegate
, где инициализируется RCTRootView
, вы проверяете, является ли это симулятором, как если бы вы делали это в обычном приложении для iOS; Затем вы передаете эту информацию в корневое представление реагирования в виде initialProperties
:
BOOL isSimulator = NO;
#if TARGET_IPHONE_SIMULATOR
isSimulator = YES;
#endif
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"ReactDemo"
initialProperties:@{@"isSimulator": @(isSimulator)}
launchOptions:launchOptions];
Теперь вы можете получить к ней доступ в JavaScript через реквизиты вашего компонента реакции:
this.props.isSimulator
В Android у вас MainActivity
, который расширяет ReactActivity
, вы можете использовать аналогичный подход:
public boolean isEmulator() {
return Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.startsWith("unknown")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86")
|| Build.MANUFACTURER.contains("Genymotion")
|| (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google_sdk".equals(Build.PRODUCT);
}
@Override
protected Bundle getLaunchOptions() {
Bundle opts = new Bundle();
opts.putBoolean("isEmulator", isEmulator());
return opts;
}
Глядя на спецификацию Java API для Итератора
интерфейса, есть объяснение различий между Enumeration
:
Итераторы отличаются от перечисления двумя способами:
- Итераторы позволяют вызывающей стороне удалять элементы из нижележащих коллекция во время итерации с четко определенная семантика.
- Имена методов были улучшены.
Суть в том, что оба Enumeration
и Iterator
дадут последовательные элементы, но Iterator
] улучшен таким образом, что имена методов короче, и имеется дополнительный метод remove
. Вот параллельное сравнение:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Как также упоминается в Спецификациях Java API, для новых программ Iterator
должен быть предпочтительнее, чем Enumeration
, поскольку «Iterator принимает место Enumeration в структуре коллекций Java ". (Из спецификации Iterator
.)
«Официально» они должны быть аналогичны интерфейсу итератора, поддерживающему дополнительные операции (например, удаление). Обычно используется итераторы.
Вот из javadocs интерфейса перечисления :
ПРИМЕЧАНИЕ. Функциональность этого интерфейса дублируется Интерфейс итератора. К тому же, Итератор добавляет необязательное удаление операция и имеет более короткий метод имена. Новые реализации должны рассмотрите возможность использования Iterator в предпочтении в Enumeration.
Если вы пишете свой собственный класс коллекции и расширяете любой из существующих классов или реализуете любой из интерфейсов платформы Collections, у вас в основном нет другого выбора, кроме как использовать Iterator.
Если по какой-то причине (которую я не могу придумать) вы создаете собственный класс коллекции, который никак не связан с java.util.Collection или java.util.Map, вам следует по-прежнему реализует Iterable, чтобы люди могли использовать ваш класс в циклах for.