gpt4 book ai didi

cocoa - 如何向 Cocoa 中的现有协议(protocol)添加方法?

转载 作者:行者123 更新时间:2023-12-03 16:07:08 25 4
gpt4 key购买 nike

我想向现有协议(protocol)扩展或添加另一种方法。虽然协议(protocol)并不特别重要,但这就是我正在尝试做的事情。

@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end

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

谢谢。

最佳答案

您无法定义协议(protocol)类别。有两种方法可以解决这个问题:

  • 使用新的正式协议(protocol)
  • 使用非正式协议(protocol)和运行时检查

正式协议(protocol)

定义一个新的正式协议(protocol)如下所示:

@protocol MyCustomMatrixDelegate <NSMatrixDelegate>

- (void) myNewMethod:(id)sender;

@end

然后你将使你的自定义类符合 <MyCustomMatrixDelegate>而不是<NSMatrixDelegate> 。如果您使用这种方法,需要注意一些事情:[self delegate]可能会被声明为 id<NSMatrixDelegate> 。这意味着你不能做[[self delegate] myNewMethod:obj] ,因为<NSMatrixDelegate>不声明myNewMethod:方法。

解决这个问题的方法是重新输入 delegate通过类型转换的对象。也许是这样的:

- (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];

非正式协议(protocol)

对于 NSObject 上的类别来说,这确实是一个奇特的名称。 :

@interface NSObject (MyCustomMatrixDelegate)

- (void) myNewMethod:(id)sender;

@end

那么你只是不实现该方法。在发送方法的类中,您可以这样做:

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

关于cocoa - 如何向 Cocoa 中的现有协议(protocol)添加方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4635845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com