Существуют ли строго типизированные коллекции в Objective-C? - PullRequest
138 голосов
/ 11 мая 2009

Я новичок в программировании для Mac / iPhone и Objective-C. В C # и Java у нас есть «дженерики», классы коллекций, члены которых могут быть только объявленного типа. Например, в C #

Dictionary<int, MyCustomObject>

может содержать только ключи, которые являются целыми числами, и значения типа MyCustomObject. Существует ли подобный механизм в Objective-C?

Ответы [ 11 ]

0 голосов
/ 28 сентября 2012

Классы Collections, предоставляемые платформами Apple и GNUStep, являются полуграничными в том смысле, что они предполагают, что им даны объекты, некоторые из которых являются сортируемыми, а некоторые отвечают на определенные сообщения. Для примитивов, таких как float, ints и т. Д., Вся структура массивов C не повреждена и может использоваться, и для них есть специальные объекты-обертки для использования в общих классах коллекции (например, NSNumber). Кроме того, класс Collection может быть подклассифицирован (или специально изменен с помощью категорий) для принятия объектов любого типа, но вы должны написать весь код обработки типов самостоятельно. Сообщения могут быть отправлены любому объекту, но они должны возвращать ноль, если это не подходит для объекта, или сообщение должно быть перенаправлено соответствующему объекту. Истинные ошибки типа должны быть обнаружены во время компиляции, а не во время выполнения. Во время выполнения они должны обрабатываться или игнорироваться. Наконец, Objc предоставляет средства отражения во время выполнения для обработки сложных случаев, а ответ на сообщение, конкретный тип и службы можно проверить на объекте перед тем, как отправить сообщение или поместить в неподходящую коллекцию. Помните, что разрозненные библиотеки и структуры принимают различные соглашения о том, как ведут себя их объекты, когда отправленные сообщения не имеют кодовых ответов, поэтому RTFM. За исключением игрушечных программ и отладочных сборок, большинству программ не нужно аварийно завершать работу, если они действительно не испортили и не попытались записать неверные данные в память или на диск, выполнить недопустимые операции (например, разделить на ноль, но вы также можете это перехватить) или получить доступ Запрещенные системные ресурсы. Динамизм и время выполнения Objective-C позволяют изящно терпеть неудачи и должны быть встроены в ваш код. (СОВЕТ), если у вас проблемы с универсальностью в ваших функциях, попробуйте некоторую специфику. Напишите функции с определенными типами и позвольте среде выполнения выбрать (поэтому они называются селекторами!) Соответствующую функцию-член во время выполнения.

Example:
    -(id) sort (id) obj;  // too generic. catches all.
     // better
    -(id) sort: (EasilySortableCollection*) esc;
    -(id) sort: (HardToSortCollection*) hsc; 
    ...
    [Sorter  sort: MyEasyColl];
    [Sorter  sort: MyHardColl];
...