Objective-C. Можете ли вы использовать протокол как интерфейс Java? - PullRequest
23 голосов
/ 18 июня 2009

Это в основном одно и то же?

Например, если у меня есть интерфейс в Java

public interface CoolObject{
 ...
}

Я могу использовать любой объект, реализующий интерфейс CoolObject в функциях, которые принимают CoolObject в качестве параметра:

public void foo(CoolObject o) {
...
}

Это то же самое в Objective-C?

@protocol CoolProtocol
...
@end

@interface Foo: NSObject <CoolProtocol>
...
@end

(void) - someMethod: (CoolProtocol *) obj {
}

Будет ли вышеуказанное работать (и будет ли это считаться правильным?)

Спасибо за ваше время. Дай мне знать, если я понадоблюсь, чтобы уточнить мой вопрос.

Ответы [ 2 ]

35 голосов
/ 18 июня 2009

Закрыть. В Objective C вы указываете, что объект реализует протокол с угловыми скобками <>, поэтому вы должны написать свой метод, например, один из следующих:

- (void) someMethod: (id <CoolProtocol>) obj { }
- (void) someMethod: (id <NSObject, CoolProtocol>) obj { }
- (void) someMethod: (NSObject <CoolProtocol> *) obj { }

Во всех случаях вы говорите, что someMethod требует объект, который реализует CoolProtocol.

id - это общий указатель на любой объект Objective C.

То есть id означает «Любой объектный объект C, который реализует CoolProtocol».

Зачастую вы хотите иметь возможность сохранять / освобождать / автоматически освобождать объект и обычно обрабатывать его как обычный объект Какао, поэтому часто полезно также добавить протокол NSObject, как это делает второй случай.

И если вы хотите убедиться, что это действительно правильный объект Какао (исключая объекты на основе NSProxy), то вы можете использовать последнюю форму, которая в основном говорит: «Я хочу любой реальный объект Какао Objective C, который реализует CoolProtocol».

14 голосов
/ 18 июня 2009

Петерс ответил отлично. Я хотел бы добавить одну вещь, хотя. Если вы добавляете протокол «NSObject» к вашему протоколу

@protocol CoolProtocol <NSObject>
@end

Это избавит вас от необходимости объявлять протокол NSObject в объявлении метода.

- (void) someMethod: (id <NSObject, CoolProtocol>) obj { }

Теперь становится

 - (void) someMethod: (id <CoolProtocol>) obj { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...