objective-C 使用包含函数指针的结构体
2011-08-01 10:19
417 查看
最近在完成一个ios上的svg解析程序,遇到了需要对不同的字符串调用不同处理函数这样的需求。
如果用if(){}else{} 的反复调用,非常不利于程序的逻辑扩展,所以还是想起了老方法,定义一个相当于map功能的结构体数组, 每个字符串对应一个处理函数,通过查找数组调用相关处理函数来完成需求,简单明了。
由于Objective-C是兼容C的,所以在ios 上完成此功能也很简单,代码如下:
a.h:
(注意我并没有把结构体和函数定义到接口中)
typedefvoid (* funActionString)(NSString *,CGContextRef);
typedefstruct _functionString{
char *functionStr;
void (*funActionString) (NSString *,
CGContextRef);
} FunStr;
funActionString initFillintoContext(NSString *fill,CGContextRef context);
funActionString initStrokeintoContext(NSString *stroke,CGContextRef context);
funActionString initStrokeWidthintoContext(NSString *strokeWidth,CGContextRef context);
a.m:
constFunStr strMap[] = {
{@"fill", &initFillintoContext},
{@"stroke", &initStrokeintoContext},
{@"stroke-width", &initStrokeWidthintoContext}
};
funActionString initFillintoContext(NSString *fill,CGContextRef context)
{
...;
}
funActionString initStrokeintoContext(NSString *stroke,CGContextRef context)
{
...;
}
funActionString initStrokeWidthintoContext(NSString *strokeWidth,CGContextRef context)
{
...;
}
编译运行,成功~~strMap可以在m文件的任何地方被使用。
for (int i = 0; i < sizeof(strMap)/ sizeof(strMap[0]); i++)
{
NSString *value = [styleDict valueForKey:strMap[i].functionStr];
if (value != nil) {
strMap[i].funActionString(value, context);
}
}
如果用if(){}else{} 的反复调用,非常不利于程序的逻辑扩展,所以还是想起了老方法,定义一个相当于map功能的结构体数组, 每个字符串对应一个处理函数,通过查找数组调用相关处理函数来完成需求,简单明了。
由于Objective-C是兼容C的,所以在ios 上完成此功能也很简单,代码如下:
a.h:
(注意我并没有把结构体和函数定义到接口中)
typedefvoid (* funActionString)(NSString *,CGContextRef);
typedefstruct _functionString{
char *functionStr;
void (*funActionString) (NSString *,
CGContextRef);
} FunStr;
funActionString initFillintoContext(NSString *fill,CGContextRef context);
funActionString initStrokeintoContext(NSString *stroke,CGContextRef context);
funActionString initStrokeWidthintoContext(NSString *strokeWidth,CGContextRef context);
a.m:
constFunStr strMap[] = {
{@"fill", &initFillintoContext},
{@"stroke", &initStrokeintoContext},
{@"stroke-width", &initStrokeWidthintoContext}
};
funActionString initFillintoContext(NSString *fill,CGContextRef context)
{
...;
}
funActionString initStrokeintoContext(NSString *stroke,CGContextRef context)
{
...;
}
funActionString initStrokeWidthintoContext(NSString *strokeWidth,CGContextRef context)
{
...;
}
编译运行,成功~~strMap可以在m文件的任何地方被使用。
for (int i = 0; i < sizeof(strMap)/ sizeof(strMap[0]); i++)
{
NSString *value = [styleDict valueForKey:strMap[i].functionStr];
if (value != nil) {
strMap[i].funActionString(value, context);
}
}
相关文章推荐
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 正确使用指针(指针作为输出型参数)与结构体指针作为函数参数
- C语言_结构体变量指针做函数参数的使用案例
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 《IOS_作业C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)
- 有一字符串包含字母,数字,编程实现取出数字;使用函数,指针实现
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 简单结构体与函数指针的使用
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 在结构体中包含自身类型指针时,使用typedef
- C语言头文件组织与包含原则(函数指针和结构体的前项声明)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- (转)关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 【嵌入式系统学习记录】基于简易通讯录对指针、结构体、函数的使用体会
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 获取Exe文件版本信息的函数(使用GetFileVersionInfo得到TFileVersionInfo结构体,包含12项内容)
- 《IOS_C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)