Для чего нужны угловые скобки "<...>" в интерфейсе класса Obj-C? - PullRequest
20 голосов
/ 16 декабря 2009

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

@interface MapMeViewController : UIViewController <CLLocationManagerDelegate, 
            MKReverseGeocoderDelegate, MKMapViewDelegate, UIAlertViewDelegate> { ... }

На мой взгляд, они выглядят как своего рода объявление типа (учитывая мой предыдущий опыт работы с PHP и JavaScript), как будто мы проверяем, MapMeViewController - это CLLocationManagerDelegate, MKReverseGeocoderDelegate, MKMapViewDelegate или UIAlertViewDelegate

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

Ответы [ 4 ]

35 голосов
/ 16 декабря 2009

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

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

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

NSObject<NSCoding, UITableViewDelegate> *myVariable;

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

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

9 голосов
/ 16 декабря 2009

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

6 голосов
/ 16 декабря 2009

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

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.noteFetcher sections] objectAtIndex:section];
4 голосов
/ 16 декабря 2009

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

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

@interface ClassName : ItsSuperclass < protocol list >

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

@interface ClassName ( CategoryName ) < protocol list >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...