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

Objective-C. Можете ли вы использовать протокол как интерфейс Java?

Это в основном то же самое?

Например, если у меня есть интерфейс в 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 {
}

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

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

4b9b3361

Ответ 1

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

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

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

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

Таким образом, id <CoolProtocol> означает "Любой объект объектива C, который реализует CoolProtocol".

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

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

Ответ 2

Ответ Питерса велик. Однако я хотел бы добавить одну вещь. Если вы добавите протокол "NSObject" к вашему протоколу

@protocol CoolProtocol <NSObject>
@end

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

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

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

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