Передача класса, который соответствует протоколу в качестве аргумента - PullRequest
1 голос
/ 09 октября 2019

Есть ли способ в Obj-C передать класс в качестве параметра, соответствующего протоколу?

Например, скажем, у меня есть набор классов, соответствующих этому протоколу:

@protocol IMyProtocol <NSObject>

+ (id)someMethodINeed;

@end

Я хочу настроить метод, который принимает любой класс, соответствующий этому протоколу.

@interface SomeClass : NSObject <IMyProtocol>

@interface AnotherClass : NSObject<IMyProtocol>

Я хочу создать такой метод:

- (void)doSomething:(Class<IMyProtocol>)customClass
{
    [customClass someMethodINeed];
    //A whole bunch of other code I don't want to copy/paste each time
}

И вызвать его с любым из этих классов

[self doSomething:SomeClass];
[self doSomething:AnotherClass];

Я не могу понять,хотя синтаксис. Это возможно?

1 Ответ

1 голос
/ 10 октября 2019

Чтобы ваш код работал , вам просто нужно передать класс, измените два вызова на:

[self doSomething:SomeClass.class];
[self doSomething:AnotherClass.class];

Однако пока это работает, компиляторне делать чеки, которые вы, вероятно, ожидаете. Вы можете передать любой класс doSomething: независимо от того, реализует ли он ваш протокол;[customClass someMethodINeed] - это динамический вызов, разрешенный (или нет) во время выполнения, и может привести к ошибке «нераспознанный селектор отправлен в класс».

(Objective-C всегда выполняет динамический поиск метода, но с типизированными значениямикомпилятор обычно может определить во время компиляции, будет ли разрешение во время выполнения успешным или нет. То, что вы видите здесь, это поведение, которое вы получаете при программировании с использованием id.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...