Каковы угловые скобки "<...>" в интерфейсе класса Obj-C?
Может ли кто-нибудь сказать мне, что угловые скобки "<... > " в интерфейсе класса Obj-C? Как это... http://snipt.net/robhawkes/cocoa-class-interface
@interface MapMeViewController : UIViewController <CLLocationManagerDelegate,
MKReverseGeocoderDelegate, MKMapViewDelegate, UIAlertViewDelegate> { ... }
С моей точки зрения они выглядят как своего рода объявление типа (учитывая мой предыдущий опыт работы с PHP и JavaScript), так как мы уверены, что MapMeViewController
- это CLLocationManagerDelegate
, MKReverseGeocoderDelegate
, MKMapViewDelegate
или UIAlertViewDelegate
Документация о синтаксисе @interface, похоже, не упоминается.
Ответы
Ответ 1
Угловые скобки в определении интерфейса класса указывают протоколы, которые соответствует вашему классу.
Протокол почти похож на интерфейс в Java или С#, добавив, что методы в протоколе Objective-C могут быть необязательными.
Дополнительно в Objective-C вы можете объявить переменную, аргумент или переменную экземпляра, чтобы соответствовать нескольким протоколам. Пример
NSObject<NSCoding, UITableViewDelegate> *myVariable;
В этом случае класс должен быть NSObject
или подклассом (только NSProxy
и его подклассы завершились с ошибкой), и он также должен соответствовать протоколам NSCoding
и UITableViewDelegate
.
В Java или С# это возможно только путем объявления указанного класса.
Ответ 2
Угловые скобки обозначают protocol. Они аналогичны интерфейсам на других языках.
Ответ 3
Вы также можете использовать их в коде, как приведение, чтобы сообщить компилятору ожидать, что объект соответствует конкретному протоколу.
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.noteFetcher sections] objectAtIndex:section];
Ответ 4
Документация Apple сообщает о скобках; см.
Принятие протокола аналогичным образом объявляет суперкласс. Оба назначают методы классу. Объявление суперкласса присваивает ему унаследованные методы; протокол назначает ему методы, объявленные в списке протоколов. Говорят, что класс принимает формальный протокол, если в его объявлении он перечисляет протокол в угловых скобках после имени суперкласса:
@interface ClassName : ItsSuperclass < protocol list >
Категории принимают протоколы одинаково:
@interface ClassName ( CategoryName ) < protocol list >