我有一个名为ABCCalendarView
的班级。它需要NSCalendar
,并从其委托中获取此对象。我试图弄清楚这个委托方法的用法,我想要适应Cocoa框架的最佳实践。
根据configuration options,我应该:
通过识别发送消息的对象的类来启动名称:
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row; - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
类名省略了前缀,第一个字母是小写的。
冒号附加在类名上(参数是对委托对象的引用),除非该方法只有一个参数,即发件人。
- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;
这表明我应该调用方法:
- (NSCalendar *)calendarViewUsesCalendar:(ABCCalendarView *)calendarView;
但是,在Cocoa框架中查看这种情况的实际示例,我可以看到使用的实际约定似乎更倾向于将类名放在方法名称的末尾。例如:
// UITableViewDataSource has the method:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// UITableViewDelegate has:
- (NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView
// UIScrollView has:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
如果我遵循这个建议我应该调用我的方法的约定:
- (NSCalendar *)calendarForCalendarView:(ABCCalendarView *)calendarView;
为什么Apple的指导方针与他们实际做了什么之间似乎存在差异?在创建委托方法时应遵循什么约定,该方法基本上只是设置调用对象的属性?
答案 0 :(得分:1)
我认为rules document内部略有不一致。有两个"一般规则"哪个州:
如果方法返回接收者的属性,请为方法命名 在属性之后。
和
在论证之前说出这个论词。
这些以及SDK名称中的先例都支持你的第二个表述:
- (NSCalendar *)calendarForCalendarView:(ABCCalendarView *)calendarView;
我认为SDK名称中有足够的证据表明您在委托部分中找到的规则应该重述。正如你所指出的,它说
通过识别发送消息的对象的类
来启动名称
但在我看来应该说:"发送一个调用者的实例作为第一个参数"。这是一种半命名规则,一半设计模式。有了这个,那些单个参数,属性返回委托名称可以是returnTypeSenderType:
形式(这是它们在实践中的方式),而不会与文档的其他部分发生冲突。