Почему приложения Storyboard по умолчанию имеют второе объявление интерфейса - PullRequest
3 голосов
/ 28 февраля 2012

Извините, если это глупо ... но меня это смущает? ...

Я пробую новое приложение раскадровки с Xcode и просто спрашиваю себя, почему есть второе объявление @interface вмой файл реализации?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {

 }

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

....

@end

Ответы [ 3 ]

10 голосов
/ 28 февраля 2012

См. Документацию Apple: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html

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

По запросу дружеский пример:

JYDuckPondManager.h

@interface JYDuckPondManager : NSObject

@property (nonatomic, assign, readonly) NSUInteger duckCount;
@property (nonatomic, assign, readonly) CGFloat    waterLevel;

- (JYDuckReaction *)feedDucks:(JYDuckFood *)food;
- (JYDuckReaction *)harassDucks:(JYDuckTaunt *)taunt;

@end

JYDuckPondManager.m (расширение, мнимая реализация опущена)

@interface JYDuckPondManager ()

//// Redefined for internal modification
@property (nonatomic, assign, readwrite) NSUInteger duckCount;
@property (nonatomic, assign, readwrite) CGFloat    waterLevel;

//// Internally exclusive properties
@property (nonatomic, strong) NSSet  *duckPersonalitySet;
@property (nonatomic, assign) CGFloat flockAnxietyLevel;

//// Private messages
- (void)recalculatePondState;

@end

Другие объекты должны иметь возможность взаимодействовать с прудом, но они не должны знать определенные вещи, происходящие в пруду, или переопределять статистику пруда.Хранение гаек и болтов в удлинителе .m гарантирует, что .h будет кратким и соответствующим образом ограниченным.

4 голосов
/ 28 февраля 2012

Второй блок @interface в файле .m является расширением.Вы можете добавить объявления для методов и переменных экземпляра, которые вы хотите использовать внутри своего класса.

3 голосов
/ 28 февраля 2012

Второй интерфейс @interface ViewController () - это расширение класса, похожее на анонимную категорию.Расширение класса объявляется как категория только без имени.Объявления, найденные в этих расширениях, напрямую расширяют объявления, найденные в первичном @interface класса, и могут иногда (в некоторых ситуациях) переопределять объявления, найденные в первичном интерфейсе.

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