Делает ли что-нибудь простое соответствие протоколу Objective-C? - PullRequest
0 голосов
/ 27 октября 2011

CocoaPlant определяет протокол CPCoreDataTraits, аналогичный UITexInputTraits примерно так:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@protocol CPCoreDataTraits <NSFetchedResultsControllerDelegate>

@optional

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;

@end

Если я хочу только синтезироватьсвойство managedObjectContext для одного из моих контроллеров представления,

@implementation MyViewController
@synthesize managedObjectContext;
@end

, т. е. я не хочу синтезировать свойство fetchedResultsController или реализовывать какой-либо из методов NSFetchedResultsControllerDelegate, если я все еще соответствуюпротокол CPCoreDataTraits, например?

@interface MyViewController : UIViewController <CPCoreDataTraits>
@end

Т.е., пока я не синтезирую свойство fetchedResultsController и не реализую какой-либо из методов NSFetechedResultsControllerDelegate, тогда конечный результат будет точнокак будто я только что объявил свойство managedObjectContext как обычно, вот так?

@interface MyViewController : UIViewController
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@end

1 Ответ

3 голосов
/ 27 октября 2011

Как вы можете видеть в объявлении протокола, реализация вашим классом двух свойств является необязательной, поскольку эти два свойства были объявлены в операторе @optional.Это означает, что любой другой класс, который будет использовать любой объект, соответствующий этому протоколу, должен проверить эффективную реализацию необязательного метода или свойства перед его использованием.

В этом примере любой класс, который хочет получить доступ к свойству fetchedResultsControllerдолжен проверить существование методов получения и / или установки, например, используя:

<code>
[myController respondsToSelector:@selector(fetchedResultsController)];
[myController respondsToSelector:@selector(setFetchedResultsController:)];

Если вызывающий метод не выполняет эту предварительную проверку и ваша реализация протокола не поддерживаетлюбой из этих методов (потому что необязательный), то приложение вызовет исключение.Таким образом, ваш подход верен, единственное различие в двух примерах состоит в том, что если вы не используете нотацию, тогда любой вызов conformsToProtocol: для вашего объекта вернет NO.

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