Для чего угловые скобки “<…>” в интерфейсе класса Obj-C?

Кто-либо может сказать мне, что делают угловые скобки" <…>" в интерфейсе класса Obj-C? Как этот … http://snipt.net/robhawkes/cocoa-class-interface

@interface MapMeViewController : UIViewController  { ... }

От моего представления они похожи на своего рода описание типа (рассматривающий мой предыдущий опыт в PHP и JavaScript), как мы удостоверяемся MapMeViewController a CLLocationManagerDelegate, MKReverseGeocoderDelegate, MKMapViewDelegate, или UIAlertViewDelegate

Документация о @interface синтаксисе, кажется, не упоминает это.

20
задан Petter Friberg 19 April 2017 в 19:30
поделиться

4 ответа

Угловые скобки в определении интерфейса класса указывают протоколы, которым соответствует ваш класс.

Протокол почти как интерфейс в Java или C #, с добавлением того, что методы в протоколе Objective-C могут быть необязательными.

Дополнительно в Objective-C вы также можете объявить переменную, аргумент или переменную экземпляра, чтобы соответствовать нескольким протоколам. Пример

NSObject<NSCoding, UITableViewDelegate> *myVariable;

В этом случае класс должен быть NSObject или подклассом (только NSProxy и его подклассы не сработают), и он также должен соответствовать обоим NSCoding ] и UITableViewDelegate протоколы.

В Java или C # это было бы возможно только путем фактического объявления указанного класса.

35
ответ дан 29 November 2019 в 23:06
поделиться

Угловые скобки указывают на протокол . Они аналогичны интерфейсам на других языках.

9
ответ дан 29 November 2019 в 23:06
поделиться

В документации Apple сообщается об использовании скобок; см. Язык программирования Objective-C в главе 4 «Принятие протокола»

Принятие протокола в некоторых отношениях аналогично объявлению суперкласса. Оба присваивают классу методы. Объявление суперкласса назначает ему унаследованные методы; протокол назначает ему методы, объявленные в списке протоколов. Говорят, что класс принимает формальный протокол, если в своем объявлении он перечисляет протокол в угловых скобках после имени суперкласса:

 @interface ClassName: ItsSuperclass <список протоколов>

Категории принимают протоколы почти таким же образом:

 @interface ClassName (CategoryName) <список протоколов>
4
ответ дан 29 November 2019 в 23:06
поделиться

Вы также можете использовать их в коде как приведение, чтобы сообщить компилятору ожидать объект, соответствующий определенному протоколу .

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.noteFetcher sections] objectAtIndex:section];
6
ответ дан 29 November 2019 в 23:06
поделиться