Я знаю, что нет единого ответа на этот вопрос, но я хотел бы узнать мнение людей о том, как они будут подходить к ситуации.
Я пишу оболочку Objective-C в библиотеку C. Мои цели:
1) Оболочка использует объекты Objective-C. Например, если C API определяет параметр, такой как char * name, Objective-C API должен использовать name: (NSString *).
2) Клиент, использующий оболочку Objective-C, не должен знать о внутреннем функционировании библиотеки C.
Скорость на самом деле не проблема.
Все просто с простыми параметрами. Конечно, нет проблем взять NSString и преобразовать его в строку C, чтобы передать ее в библиотеку C.
Моя нерешительность проявляется, когда речь идет о сложных структурах.
Допустим, у вас есть:
struct flow
{
long direction;
long speed;
long disruption;
long start;
long stop;
} flow_t;
And then your C API call is:
void setFlows(flow_t inFlows[4]);
Итак, некоторые из вариантов:
1) предоставить клиенту структуру flow_t и заставить Objective-C API принять массив этих структур
2) построить NSArray из четырех NSDictionaries, содержащих свойства, и передать его в качестве параметра
3) создать NSArray из четырех объектов «Flow», содержащих свойства структуры, и передать его в качестве параметра
Мой анализ подходов:
Подход 1: самый простой. Тем не менее, это не соответствует целям дизайна
Подход 2: По какой-то причине, мне кажется, это самый "Objective-C" способ сделать это. Однако каждый элемент NSDictionary должен быть обернут в NSNumber. Теперь кажется, что мы делаем очень много, просто чтобы передать эквивалент структуры.
Подход 3: кажется мне наиболее чистым с объектно-ориентированной точки зрения, и дополнительная инкапсуляция может пригодиться позже. Однако, как и в случае с №2, теперь кажется, что мы делаем очень много (создаем массив, создаем и инициализируем объекты) просто для передачи структуры.
Итак, вопрос в том, как бы вы подошли к этой ситуации? Есть ли другие варианты, которые я не рассматриваю? Есть ли дополнительные преимущества или недостатки в подходах, которые я представил, которые я не рассматриваю?