Objective C: Когда нам нужно создать новый протокол делегирования?

#objective-c #delegates #protocols

#objective-c #делегаты #протоколы

Вопрос:

Я просматривал некоторые примеры кода и наткнулся на это приложение, которое, которое имеет следующие классы

1) Класс FaceView — рисует лицо и настраиваемую улыбку 2) Класс HappinessViewContoller — устанавливает улыбку на нарисованном лице на основе ввода ползунка в интерфейсе.

Программа фактически реализует протокол делегирования в классе FaceView.h, как показано ниже

 #import <UIKit/UIKit.h>

@class FaceView;

@protocol FaceViewDelegate
- (float)smileForFaceView:(FaceView *)requestor;  // -1.0 (frown) to 1.0 (smile)
@end

@interface FaceView : UIView {
    id <FaceViewDelegate> delegate;
}

@property (assign) id <FaceViewDelegate> delegate;

@end
  

и HappinessViewController объявляет, что он использует FaceViewDelegate

 #import <UIKit/UIKit.h>
#import "FaceView.h"

@interface HappinessViewController : UIViewController <FaceViewDelegate>
{
    int happiness; // 0 to 100
    UISlider *slider;
    FaceView *faceView;
}

@property int happiness;

@property (retain) IBOutlet UISlider *slider;
@property (retain) IBOutlet FaceView *faceView;

- (IBAction)happinessChanged:(UISlider *)sender;

@end
  

Я немного смущен тем, почему в этом сценарии требуется протокол делегирования. Могу ли я просто установить метод «- (float)smileForFaceView:(FaceView *)requestor;» непосредственно в HappinessViewController без объявления делегата для FaceView?

Спасибо!

Zhen Hoe

Ответ №1:

Никогда не требуется создавать протокол для делегатов, но это облегчает обеспечение совместимости, если есть методы, которые требуется реализовать делегату. В этом случае, когда делегат установлен, объект FaceView может использовать [newDelegate conformsToProtocol:@protocol(FaceViewDelegate)] , чтобы убедиться, что делегат реализует любые требуемые методы. Если они решат добавить больше требуемых методов, им не придется изменять свой код, потому что делегат должен реализовать все требуемые методы для соответствия.

Если у вас нет каких-либо требуемых методов, то это не так выгодно, поскольку вы не можете использовать его для проверки типов. Однако, если вы пишете библиотечный код, вам все равно следует его использовать, потому что вы можете поместить туда все ваши возможные методы делегирования и использовать его в качестве ссылки.