【问题标题】:Implementing State Machines with Enums in Objective C在 Objective C 中使用枚举实现状态机
【发布时间】:2014-05-23 06:22:02
【问题描述】:

我需要像这样的java代码在objective-c中实现状态机:

public enum State {

    INITIAL {
        @Override
        State doSomething(String aParameter) {
            System.out.println("Doing Something in INITIAL state and jumping to NEXT_STEP, argument = " + aParameter);
            return NEXT_STEP;
        }
    },
    NEXT_STEP {
        @Override
        State doSomething(String aParameter) {
            System.out.println("Doing Something in NEXT_STEP and jumping into FINAL, argument = " + aParameter);
            return FINAL;
        }
    },
    FINAL {
        @Override
        State doSomething(String aParameter) {
            System.out.println("I am in FINAL state, argument = " + aParameter);
            return this;
        }
    };

    abstract State doSomething(String aParameter);
}

参考链接是: http://www.mirkosertic.de/doku.php/javastuff/enumstatemachine

谁能给我一些建议?

【问题讨论】:

  • 这看起来不像 ObjectiveC。
  • 是的,你说得对,我的要求不是很清楚;这段代码是java,但我想在客观的c中得到相同的结果
  • 检查CocoaPods,有几个状态机可用。
  • 你不能用 C 枚举来做到这一点。有关 C++Java 枚举之间的区别,请参阅此 SO 帖子(也适用于 C):stackoverflow.com/q/2080681/558933
  • 有十几种不同的方法可以做到这一点,它们都不涉及枚举,除了可能枚举表中使用的可能状态。使用好的 ol' switch 将是最明显的选择,或者是一个公共类的多个子类。关于函数指针的几种变体中的任何一种——直接的 C 或 Objective-C 版本。

标签: objective-c enums


【解决方案1】:

感谢收到的信息,并根据我的需要..

希望找到最佳解决方案,分享一下:

文件StateHandler.h:

enum State {
    INITIAL,
    NEXT_STEP,
    FINAL
};

@interface StateHandler

+(enum State)doSomething:(NSString *)aParameter withState:(enum State)state;

@end

文件StateHandler.m:

#import "StateHandler.h"

@protocol StateProtocol <NSObject>
@required +(enum State)doSomething:(NSString *)aParameter;
@end

@interface StateInitial : NSObject <StateProtocol>
@end

@interface StateNextStep : NSObject <StateProtocol>
@end

@interface StateFinal : NSObject <StateProtocol>
@end

@implementation StateHandler

+(enum State)doSomething:(NSString *)aParameter withState:(enum State)state {
    switch(state) {
        case INITIAL:
            return [StateInitial doSomething:aParameter];

        case NEXT_STEP:
            return [StateNextStep doSomething:aParameter];

        case FINAL:
            return [StateFinal doSomething:aParameter];
    }
}
@end

@implementation StateInitial
+(enum State)doSomething:(NSString *)aParameter {
    NSLog(@"Doing Something in INITIAL state and jumping to NEXT_STEP, argument = %@", aParameter);
    return NEXT_STEP;
}
@end

@implementation StateNextStep
+(enum State)doSomething:(NSString *)aParameter {
    NSLog(@"Doing Something in NEXT_STEP and jumping into FINAL, argument = %@", aParameter);
    return FINAL;
}
@end

@implementation StateFinal
+(enum State)doSomething:(NSString *)aParameter {
    NSLog(@"I am in FINAL state, argument = %@", aParameter);
    return FINAL;
}
@end

【讨论】:

  • 哇...这么复杂!你真的需要不同的课程来完成不同的步骤吗?此外,您使用返回值指向下一个枚举,但您从不在代码中使用此返回值...您绝对应该查看NSOperation
  • 另一种可能性是创建一个用状态初始化的单例,它在内部的属性中保留其状态。对于每个方法调用“doSomething”控件,带有开关状态并分派到内部的方法..您认为@Vinzzz 怎么样?欢迎任何建议
  • 我认为,就像另一条评论所说的那样,有很多方法可以做到这一点。如果你正在寻找灵感,另一个来自 Apple 的 iOS 状态机示例是 UIGestureRecognizer,虽然我并不是说这个特殊的设计会被复制......我唯一的谦虚建议:不要过度 -设计事物,保持简单;)
  • 这不是很聪明的方式来实现FSM。缺少状态转换。基本上这是以客观方式编写的 if else 条件。
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多