我想知道Objective-C接口(.h)文件的标准布局/格式是什么。我知道这个文件中有哪些组件,但我看到它们以多种不同的方式展示。
接口文件的许多组件非常明显,如#import
,@class
等。但对于类似@protocol
和@interface
声明的内容,它可以与众不同。我看到人们在接口声明之上声明了一个新的协议,其实现方法如下:
@protocol MyNewClassDelegate;
@interface MyNewClass : UIViewController
// Properties and Methods
@end
@protocol MyNewClassDelegate <NSObject>
- (void)method
@end
我已经看到的另一种方式是将整个@protocol
声明和实现放在@interface
语句之上。所以它是这样的:
@protocol MyNewClassDelegate <NSObject>
- (void)method
@end
@interface MyNewClass : UIViewController
//Properties and Methods
@end
我还看到了它在接口上方声明和实现一个协议的设置,而另一个协议也在下面声明和实现。
我的问题是哪个首选或是行业标准?是否有某种方法可以根据其功能的实现来组织它?
答案 0 :(得分:1)
我不知道我的回答是如何比其他回答更正确,但这是我在大多数应用程序中所做的。
#import
#import
#define
#define
typedef
typedef
@class ClassName
@class ClassName
@protocol ProtocolName;
@interface Name : inheritedObject <FirstProtocolSupported, SecondProtocolSupported, etc>
@property (noantomic, strong) IBOutlet Object* name;
@property (noantomic, strong) IBOutlet Object* name;
@property (noantomic, strong) IBOutlet Object* name;
@property (nonatomic, strong) Object* name;
@property (nonatomic, strong) Object* name;
@property (nonatomic, strong) Object* name;
- (IBAction)actionName:(SenderObject*)sender;
- (IBAction)actionName:(SenderObject*)sender;
- (IBAction)actionName:(SenderObject*)sender;
- (type)methodName:(Parameter*)argument;
- (type)methodName:(Parameter*)argument;
- (type)methodName:(Parameter*)argument;
@end
@protocol ProtocolName <ProtocolThatIsImplmented>
- (type)protocolMethod:(Param*)parameter;
@end
本质上是,然后是import语句,然后是#define语句,然后是typedef语句,@ class语句,任何协议,然后是类声明,然后是iboutlet属性,然后是普通属性,然后是inaction方法,然后是正常动作,然后是协议声明。
总而言之,没有正确的方法来订购.h文件中的代码,只要一切都被准确宣布,这都是首选问题
答案 1 :(得分:1)
据我所知,编写.h
文件没有任何正确(甚至是首选)约定。除非您拥有大量属性和方法(例如Apple的许多基础和UIKit类),否则头文件通常非常短。即使是最笨重的头文件通常也不会超过几百行代码,因此不用担心。
但是,有时您的协议及其类将是相互依赖的。换句话说,协议需要知道类,并且类需要知道协议。
例如,UITableView
需要了解协议UITableViewDelegate
和UITableViewDataSource
,因为它定义了必须符合这些协议的属性(即delegate
和{{ 1}})。但是,每个协议还需要了解dataSource
,因为它们都需要UITableView
作为其许多方法的参数(例如UITableView
)。
在这种情况下,除非您在numberOfSectionsInTableView:
定义之前使用转发@class
声明,否则您的第二个示例(在课程之前完整地声明协议)是不够的。您的第一个示例将工作,因为您在课程前使用了前向@protocol
声明。
答案 2 :(得分:0)
我更喜欢我的协议在他们自己的.h文件中。这样他们就可以轻松地重复使用。
你也不必担心这个命令&#39; #import它的事情。
//Copyright & license
#import
#import "AProtocol.h"
#import "Typedefs.h"
#import "NeededConsts.h"
@class ClassName;
@class ClassName;
@interface Name : inheritedObject
@property (strong, nonatomic) Object* name;
- (type)methodName:(Parameter*)argument;
- (void)setDelegate:(id <AProtocol>)argument;
@end
在Name.m文件中(我尝试尽可能多地保留.h文件中的信息)
//Copyright & license
#import ...
#import "ProtocolName.h"
file wide typedef
file wide typedef
@class ClassName;
@class ClassName;
static const NSInteger cFileWideInt = 404;
@interface Name () <FirstProtocolSupported, SecondProtocolSupported, etc>
@property (strong, nonatomic) IBOutlet Object* name;
@property (strong, nonatomic) IBOutlet Object* name;
@property (weak, nonatomic) id<AProtocol> delegate;
@end
@implementation
@end
在.m文件中包含大部分属性和声明的好处在于它提供了“封装”功能。有关您的其他课程不需要了解的信息。这一点导致了代码架构,这将把它变成一个冗长而复杂的答案; P