Подтвердить что ты не робот

Каковы угловые скобки "<...>" в интерфейсе класса 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, похоже, не упоминается.

4b9b3361

Ответ 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 >