【发布时间】:2011-01-28 16:10:48
【问题描述】:
我知道这个问题没有一个答案,但我想了解人们对如何处理这种情况的想法。
我正在为 C 库编写一个 Objective-C 包装器。我的目标是:
1) 包装器使用 Objective-C 对象。例如,如果 C API 定义了 char *name 这样的参数,Objective-C API 应该使用 name:(NSString *)。
2) 使用 Objective-C 包装器的客户端不必了解 C 库的内部工作原理。
速度不是问题。
使用简单的参数就可以轻松搞定。拿一个 NSString 转成 C 字符串传给 C 库当然没问题。
当涉及到复杂的结构时,我就会犹豫不决。
假设你有:
struct flow
{
long direction;
long speed;
long disruption;
long start;
long stop;
} flow_t;
And then your C API call is:
void setFlows(flow_t inFlows[4]);
因此,一些选择是:
1) 向客户端公开 flow_t 结构并让 Objective-C API 获取这些结构的数组
2) 构建包含属性的四个 NSDictionaries 的 NSArray,并将其作为参数传递
3) 创建一个包含结构属性的四个“Flow”对象的 NSArray,并将其作为参数传递
我对方法的分析:
方法1:最简单。但是,它不符合设计目标
方法2:出于某种原因,在我看来,这似乎是最“Objective-C”的做法。但是,NSDictionary 的每个元素都必须包装在一个 NSNumber 中。现在似乎我们做了很多工作只是为了传递一个结构的等价物。
方法 3:从面向对象的角度来看,对我来说似乎是最干净的,额外的封装以后可能会派上用场。然而,就像 #2 一样,现在我们似乎做了很多事情(创建数组、创建和初始化对象)只是为了传递一个结构。
那么,问题是,您将如何处理这种情况?还有其他我没有考虑的选择吗?我所介绍的方法是否还有其他我没有考虑的优点或缺点?
【问题讨论】:
-
框架本身包含结构。 NSRange 等。我认为在结构上没有一刀切的决定。这取决于。
标签: objective-c