【问题标题】:Static variables in objective-CObjective-C 中的静态变量
【发布时间】:2012-09-06 16:16:27
【问题描述】:

我已经搜索了有关 Objective-C 中静态变量的帖子,但还没有完全找到这个问题的答案:

在 Java 中,我可以创建一个具有相同类类型的静态变量的类,如下所示:

public class Status {

    public static final Status SUCCESS = new Status(0, "Success");
    public static final Status FAILURE = new Status(-1, "It's Broke");

    private int number;
    private String message;

    private Status(int number, String message) {
        this.number = number;
        this.message = message;
    }
}

然后我可以像这样使用 Status 中的静态变量:

public Status foo() {
    ...
    return Status.FAILURE;
}

有人能告诉我如何在 Objective-C 中做类似的事情吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    大多数 Cocoa API 使用简单的枚举来返回此类结果。

    typedef enum {
        MyClassResultSuccess = 0,
        MyClassResultFailure = -1
    } MyClassResult;
    

    如果您想使用与您发布的内容更相似的方法,您可以使用类方法:

    @interface Status
    @property (nonatomic) int value;
    @property (nonatomic, copy) NSString *message;
    - (id)initWithValue:(int)value message:(NSString *)message;
    + (Status *)success;
    + (Status *)failure;
    @end
    
    @implementation Status
    
    static Status *_success = nil;
    static Status *_failure = nil;
    
    - (id)initWithValue:(int)value message:(NSString *)message {
        self = [super init];
        if (self) {
            self.value = value;
            self.message = message;
        }
        return self;
    }
    
    + (Status *)success {
        if (!_success)
            _success = [[Status alloc] initWithValue:0 message:@"Success"];
        return _success;
    }
    
    + (Status *)failure {
         if (!_failure)
            _failure = [[Status alloc] initWithValue:-1 message:@"Failure"];
        return _failure;
    }
    
    @end
    

    【讨论】:

    • 在这种情况下,我会非常不愿意为每次失败分配一个新对象......编辑:或者我误解了什么?
    • 是的,我解决了这个问题。但我真的只使用枚举,如果你不需要任何额外的功能@user1143970
    • @DrummerB:您可能也希望将 _success_failure 范围限定为它们各自的方法。
    • 这是一个简单的例子,但是如果您有一些其他类型需要将枚举转换为文本字符串,则必须创建单独的翻译函数来将枚举转换为字符串。我在 Java 中经常使用这种模式,并且效果很好。在 Objective-c 中是否有另一种方法可以使用或不使用枚举?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2011-08-27
    • 2012-01-26
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多