Эффективный и быстрый способ доступа к контейнерам CoreFoundation - PullRequest
0 голосов
/ 22 февраля 2012

Я пытаюсь использовать контейнеры CoreFoundataion. Кажется, это действительно удобный способ доступа к списку свойств. Тем не менее, я заметил, что очень неудобно обращаться к внутренним контейнерам, если контейнер вложен (например, CFArrayRef содержит CFDictionaryRef, который затем имеет ключ, значением которого является другой CFArrayRef. Может быть, график ниже демонстрирует немного лучше).

CFArrayRef a

    |----CFDictionaryRef b (assume it's at index 2 of a)

                  |----CFArrayRef c (assume, they key value is "array")

Допустим, мы получили CFArrayRef a И я хочу получить доступ к элементу в CFIndex 0 в CFArrayRef c

Я должен напечатать что-то вроде этого:

CFArrayGetValueAtIndex((CFArrayRef)CFDictionaryGetValue((CFDictionaryRef)CFArrayGetValueAtIndex(a, 2), CFSTR("array")), 0)

Мне кажется, это много печатать. Я предполагаю, что CoreFoundation основан на C, а не на C ++, поэтому он не обеспечивает перегрузку операторов, например "[]", для доступа к его элементу.

Есть ли способ сделать этот доступ проще при наборе текста (возможно, и для чтения?)

Я использую C ++, я рассматриваю возможность перегрузки оператора "[]" для определенного CFTypeRef (такого как CFArrayRef, CFDictionaryRef, CFStringRef), но не уверен, что это хорошая идея.

1 Ответ

2 голосов
/ 15 июля 2012

Как вы отметили, Core Foundation API - это C API, поэтому нет оператора [] для перегрузки.В основном у вас есть 3 варианта:

  1. написать C на нескольких строках, чтобы решить проблему читабельности
  2. написать оболочки C ++, если вы действительно хотите использовать C ++
  3. и использовать ObjectiveC, если у вас уже есть, все типы, которые вы упомянули здесь, являются «бесплатными»

Я бы сказал, придерживайтесь 1.

...