我有一个用C编写的功能相当大,目前只在C文件的main()函数中运行,而我一直在测试它。这是它的声明
void getData(const char* encodedBuffer, int user);
如果你想看到getData Here的内容是它的pastebin。
截至目前,我只是传递encodedBuffer,我将有一个全局变量,由getData
函数更新。
我想知道将这样的基于C的函数转换为Objective-C协议方法的正确方法是什么。现在我就像这样设置它
iDriver.h(我的界面/协议)
#import <Foundation/Foundation.h>
@protocol iDriver <NSObject>
-(void)getData;
-(void)cancel;
@end
DriverOne.h(实际实现协议方法的类)
#import <Foundation/Foundation.h>
#import "iDriver.h"
@interface DriverOne : NSObject <iDriver>
@end
DriverOne.m
#import "DriverOne.h"
@implementation DriverOne
enum Status getData(char* encodedBuffer, int user)
{
// Copy C code which I showed in the link earlier
// to above into this method. I will want it to return a status
// and populate a global variable with the data.
}
我的想法是,我不应该遇到任何问题,因为Objective-C是C的超集,但只是将C代码复制到这样的方法中会有问题吗?
答案 0 :(得分:1)
将C函数移植到ObjC方法时,只需对签名进行调整即可。在您的情况下,您将改变:
enum Status getData(char* encodedBuffer, int user)
类似于:
- (enum Status) getData: (char*) encodedBuffer user: (int) user
目标C方法总是在开头用-
表示(类方法以+
开头)。如果你想指定类型,你可以放入parens(否则它被假定为id
类型,它对于&#34; object&#34;)是通用的。您必须将您的函数名称键入关键字。每个参数都有一个关键字。
然后就像C一样,你可以将该行复制粘贴到头文件中:
@protocol iDriver <NSObject>
- (enum Status) getData: (char*) encodedBuffer user: (int) user;
@end
之后只需复制方法中的内容。
目前尚不清楚你对OO和实例背后的想法有多熟悉,但使用它可能看起来像:
DriverOne *driverOneObject = [[DriverOne alloc] init];
char *buffer = malloc(YOUR_BUFFER_SIZE);
enumStatus status = [driverObject getData: buffer user: SomeUserThing];
完整的循环,是否有理由想要将其改为(变成对象)?我自己都拥有很多对象,但是ObjectiveC的一个特性就是它是C的超集。你可以像C原型一样使用你的函数。你不必将它包装在ObjectiveC对象中,除非你看到这样做的优势。