我正在尝试构建一个FSM来控制(iphone sdk)目标c中的计时器.我觉得这是一个必要的步骤,因为我最终得到了含有if-then语句页面的令人讨厌的意大利面条代码.复杂性,不可读性以及添加/更改功能的难度使我尝试更正式的解决方案.
在应用程序的上下文中,计时器的状态确定与NSManagedObjects,Core Data等的一些复杂交互.我暂时保留了所有功能,试图清楚地了解FSM代码.
问题是,我在Obj-C中找不到这种代码的任何例子,我对如何从我使用的C++示例代码中翻译它并不是很有信心.(我完全不懂C++,所以有一些猜测.)我在这篇文章的基础上建立了这个版本的状态模式设计:http://www.ai-junkie.com/architecture/state_driven/tut_state1. HTML.我不是在制作游戏,但是这篇文章概述了适用于我正在做的事情的概念.
为了创建代码(在下面发布),我必须学习很多新概念,包括obj-c协议等等.因为这对我来说是新的,就像状态设计模式一样,我希望得到一些关于这种实现的反馈.这是你如何在obj-c中有效地使用协议对象?
这是协议:
@class Timer;
@protocol TimerState
-(void) enterTimerState:(Timer*)timer;
-(void) executeTimerState:(Timer*)timer;
-(void) exitTimerState:(Timer*)timer;
@end
Run Code Online (Sandbox Code Playgroud)
这是Timer对象(在其最剥离的形式中)头文件:
@interface Timer : NSObject
{
id<TimerState> currentTimerState;
NSTimer *secondTimer;
id <TimerViewDelegate> viewDelegate;
id<TimerState> setupState;
id<TimerState> runState;
id<TimerState> pauseState;
id<TimerState> resumeState;
id<TimerState> finishState;
}
@property (nonatomic, retain) id<TimerState> currentTimerState;
@property (nonatomic, retain) NSTimer *secondTimer;
@property (assign) id <TimerViewDelegate> viewDelegate;
@property (nonatomic, retain) id<TimerState> setupState;
@property (nonatomic, retain) id<TimerState> runState;
@property (nonatomic, retain) id<TimerState> pauseState;
@property (nonatomic, retain) …Run Code Online (Sandbox Code Playgroud) 我试图定义一个非常简单的实用方法,这将使我不必使用计算器将RGB值定义为百分比.当我查看Apple的示例代码"QuartzCache"时,在DrawView.m文件第96行中,我看到了这一点:
float whiteColor[4] = {1, 1, 1, 1};
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试创建如下方法时,编译器讨厌我.半小时的密集谷歌搜索没有提供任何帮助.
+(float[])percentagesRGBArray:(float[])rgbArray{
float red = rgbArray[0];
float green = rgbArray[1];
float blue = rgbArray[2];
float alpha = rgbArray[3];
red = red/255;
green = green/255;
blue = blue/255;
alpha = alpha;
float percentagesRGBArray[4] = {red, green, blue, alpha};
return percentagesRGBArray;
}
Run Code Online (Sandbox Code Playgroud)
定义这种方法的正确方法是什么?我在这做错了什么?