Ios 如何创建协议扩展现有协议并将所需更改为可选?

Ios 如何创建协议扩展现有协议并将所需更改为可选?,ios,objective-c,iphone,Ios,Objective C,Iphone,是否可以覆盖现有协议并使其成为可选协议?例如,在CUSTOMTableViewDataSource中,如果编译器未实现-(NSInteger)tableView:(UITableView*)tableView行数section:(NSInteger)节,则不应生成警告 @protocol CUSTOMTableViewDataSource <UITableViewDataSource> @optional - (NSInteger)tableView:(UITableView *)t

是否可以覆盖现有协议并使其成为可选协议?例如,在CUSTOMTableViewDataSource中,如果编译器未实现
-(NSInteger)tableView:(UITableView*)tableView行数section:(NSInteger)节
,则不应生成警告

@protocol CUSTOMTableViewDataSource <UITableViewDataSource>
@optional
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
@end
@protocol CUSTOMTableViewDataSource
@可选的
-(NSInteger)表视图:(UITableView*)表视图行数节:(NSInteger)节;
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;
@结束

恐怕编译器会在此处生成警告。协议具有@required和@optional方法,它们在创建时声明。在您的情况下,如果打开UITableView.h文件,您可以清楚地看到这两种方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

声明为@required methods&UITableView.h的内容被锁定,因此您无法修改它。在你的例子中,谈到这两种方法,答案是否定的。另一方面,如果我定义一个协议,我可以根据需要选择声明方法@required和@optional

您可以声明采用UITableViewDataSource协议的CUSTOMTableViewDataSource协议,但根据定义,这意味着如果类采用CUSTOMTableViewDataSource协议,它还采用UITableViewDataSource协议-因此,如果未实现UITableViewDataSource所需的方法,编译器仍将发出警告。

您没有“覆盖”现有协议。你正在采用它(在另一个协议中)。从这个意义上讲,CUSTOMTableViewDataSource继承了UITableViewDataSource。但这和类继承不同,你应该问问自己为什么要这样做。我正试图定义一个扩展UITableViewDataSource的协议,如果任何人采用该协议实现UITableViewDataSource中的任何方法,它将使用该方法,如果不采用,它将使用我自己的内部实现。在这种情况下,
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)节不是必需的。再解释一下,我试图创建一个实现所有UITableViewDataSource方法的对象,但也给用户一个覆盖任何UITableViewDataSource方法的选项。用户可以对您的类进行子类化。为什么他说他不能这样做?你试过了吗?他当然能做到。没有错误消息。他的代码可以编译得很好。但是他无法避免警告。@matt是的,我试过了。您是对的,代码将被编译,但我的观点是,如果编译器不给出警告,他就不能这样做&以这种方式采用协议也不是一种好的做法。因此,我要求他首先检查[at]必选方法和[at]可选方法。谢谢