为什么默认的Storyboard应用程序有第二个接口声明

spa*_*r79 3 iphone objective-c storyboard ios

对不起,如果这是愚蠢的...但它让我困惑?...

我正在尝试使用Xcode的新故事板应用程序,并问自己为什么在我的实现文件中有@interface的第二个声明?

.H

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {

 }

@end
Run Code Online (Sandbox Code Playgroud)

.M

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

....

@end
Run Code Online (Sandbox Code Playgroud)

Jan*_*Yri 10

请参阅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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

其他物体应该能够与池塘相互作用,但它们不应该知道池塘中发生的某些事情或重新定义池塘的统计数据.在.m扩展名中保留螺母和螺栓可确保.h简洁且适当受限.