• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Obj-c,我可以使用协议(protocol)作为函数参数的一种参数吗?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:58:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在创建一个 cocoa touch 框架来在我的应用程序之间共享一些通用代码。

我需要将一个类的实例传递给一个方法,该方法具有一些特定的属性。

该方法将从应用程序中调用。

我对使用协议(protocol)很陌生。

我是否应该在我的框架中创建一个包含函数所需的所有属性的协议(protocol) h 文件。

如果可以,我可以将协议(protocol)作为实例变量的类型传递给函数吗?

如果没有怎么能做到这一点?



Best Answer-推荐答案


是的,你可以。这是一个例子。

首先,在 .h 文件中声明您的协议(protocol):

@protocol Vehicle <NSObject>

@property NSNumber * numberOfWheels;

@required
-(void)engineOn;

@end

声明符合你的协议(protocol)的类:

#import "Vehicle.h"

@interface Car : NSObject <Vehicle>

@end

实现所需的方法并综合属性:

@implementation Car
@synthesize numberOfWheels;

-(void)engineOn {
    NSLog(@"Car engine on");
}

@end

还有一个,举个例子:

#import "Vehicle.h"

@interface Motorcycle : NSObject <Vehicle>

@end

@implementation Motorcycle
@synthesize numberOfWheels;

-(void)engineOn {
    NSLog(@"Motorcycle engine on");
}

@end

当您声明要接受 Vehicle 参数的方法时,您使用通用 id 类型并指定传入的任何对象都应符合 车辆:

#import "Vehicle.h"

@interface Race : NSObject

-(void)addVehicleToRaceid<Vehicle>)vehicle;

@end

然后,在该方法的实现中,您可以使用协议(protocol)中声明的属性和方法,而不管传入的具体类型如何:

@implementation Race

-(void)addVehicleToRaceid<Vehicle>)vehicle {
    [vehicle engineOn];
}

@end

然后,如您所料,您可以传入符合您的协议(protocol)的具体类的实例:

Motorcycle *cycle = [[Motorcycle alloc] init];
cycle.numberOfWheels = 2;
Car *car = [[Car alloc] init];
car.numberOfWheels = 4;
Race *race = [[Race alloc] init];
[race addVehicleToRace:car];
[race addVehicleToRace:cycle];

并且将执行协议(protocol)方法的适当具体实现,具体取决于您作为参数传递的实际具体类型:

2018-10-15 13:53:45.039596+0800 ProtocolExample[78912:1847146] Car engine on
2018-10-15 13:53:45.039783+0800 ProtocolExample[78912:1847146] Motorcycle engine on

关于ios - Obj-c,我可以使用协议(protocol)作为函数参数的一种参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52807377/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap