如何在Cocoa中为现有协议添加方法?

如何在Cocoa中为现有协议添加方法?,第1张

概述我想扩展或添加另一种方法到现有协议.虽然协议特别重要,但这正是我想要做的. @protocol NSMatrixDelegate- (void)myNewMethod:(id)sender;@end 编译器警告我有相同协议的重复声明.我该如何正确地做到这一点? 谢谢. 您无法定义协议的类别.有两种方法: >使用新的正式协议 >使用非正式协议和运行时检查 正式议定书 定义新的正式协议将如下所示 我想扩展或添加另一种方法到现有的协议.虽然协议特别重要,但这正是我想要做的.

@protocol NSMatrixDelegate- (voID)myNewMethod:(ID)sender;@end

编译器警告我有相同协议的重复声明.我该如何正确地做到这一点?

谢谢.

解决方法 您无法定义协议的类别.有两种方法:

>使用新的正式协议
>使用非正式协议和运行时检查

正式议定书

定义新的正式协议将如下所示:

@protocol MyCustomMatrixDelegate <NSMatrixDelegate>- (voID) myNewMethod:(ID)sender;@end

然后,您将使自定义类符合< MyCustomMatrixDelegate>而不是< NSMatrixDelegate>.如果您使用这种方法,需要注意的事项:[self delegate]可能会被声明为ID< NSMatrixDelegate>.这意味着您无法执行[[self delegate] myNewMethod:obj],因为< NSMatrixDelegate>不声明myNewMethod:方法.

解决这个问题的方法是通过强制转换重新键入委托对象.也许是这样的:

- (ID<MyCustomMatrixDelegate>) customDelegate {  return (ID<MyCustomMatrixDelegate>)[self delegate];}

(但是,您可能希望先进行一些类型检查,例如:

if ([[self delegate] conformstoprotocol:@protocol(MyCustomMatrixDelegate)]) {  return (ID<MyCustomMatrixDelegate>)[self delegate];}return nil;

)

然后你会这样做:

[[self customDelegate] myNewMethod:obj];

非正式议定书

对于NSObject上的类别,这实际上是一个奇特的名称:

@interface NSObject (MyCustomMatrixDelegate)- (voID) myNewMethod:(ID)sender;@end

那你就是不要实现这个方法.在你的类中发送方法,你会做:

if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {  [[self delegate] myNewMethod:someSenderValue];}
总结

以上是内存溢出为你收集整理的如何在Cocoa中为现有协议添加方法?全部内容,希望文章能够帮你解决如何在Cocoa中为现有协议添加方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1021552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存