objective-c - 协议(protocol)作为方法参数

标签 objective-c

我想要一个方法可以访问在单个类中声明的方法的子集。显然这可以通过协议(protocol)来实现。

方法子集在 HouseProtocol 中声明,而类 House 实现其方法。

@protocol HouseProtocol <NSObject>
-(void) foo;
@end

.

@interface House : NSObject <HouseProtocol>
-(void) foo;
-(void) bar;
@end

在另一个类的其他地方,定义了一个带有 HouseProtocol 参数的方法:

-(void) somemethod:(id<HouseProtocol>)hp;

此方法应使用 house 方法,但只能使用 HouseProtocol 中可访问的方法。意思是方法 foo 但不是方法 bar。

以上是否正确,foo 方法是如何在某个方法中调用的?工作代码表示赞赏。

最佳答案

这是正确的。在 hp 上调用方法照常工作:

- (void) somemethod: (id<HouseProtocol>) hp
{
    [hp foo];
}

请注意,如果您真的不需要该协议(protocol)(例如,如果代码非常简单并且编写协议(protocol)显然是多余的),您可以简单地使用 id输入:

- (void) somemethod: (id) hp
{
    [hp foo];
}

在这种情况下唯一的问题是编译器必须知道 -foo存在。

从问题标题来看,让您感到困惑的是您对 hp 类型的看法。变量 - id<HouseProtocol>不是协议(protocol),它是“实现 HouseProtocol 的东西” ”。这就是为什么您可以在 hp 上调用方法的原因通常的方式,因为它只是某种对象。

关于objective-c - 协议(protocol)作为方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11931891/

相关文章:

ios - CLLocationManager#startMonitoringSignificantLocationChanges 是否提示用户访问 iPod Touch?

ios - 从 UIActionSheet 呈现 UIPopover

iphone - 如何在 iPhone (iOS) 上检测硬件键盘上的键盘事件

ios - 当文本字段没有 IBOutlet 时关闭键盘

ios - 在运行时自定义 UITableView Header Section

ios - 检查收到的通知是否显示警报 View 的测试用例

ios - 设置后缺少 AFNetworking 请求 header

c++ - Objective-C++的缺点?

ios - __NSCFString timeIntervalSinceReferenceDate] : unrecognized selector sent to instance