声明类型为枚举值的属性的正确方法

时间:2014-06-17 12:52:55

标签: objective-c

我希望我的类有一个只能从枚举中赋值的属性,但我不能完全理解语法。这是我的头文件:

NS_ENUM(NSInteger, SPSSearchResultsOrder) {
  SPSSearchResultsOrderAlphabetical,
  SPSSearchResultsOrderPrice
};

@interface SPSSearchQuery : NSObject

@property (readonly, nonatomic) enum SPSSearchResultsorder searchResultsOrder;

// etc.

@end

Xcode建议我将enum关键字添加到我的属性声明中以获取编译代码,这就是为什么我认为这不对。

该属性是否应该键入为NSInteger,因为它是枚举的类型?在这种情况下,如何强制只能为属性分配一个枚举值?

如果我用Java写这个,我会做这样的事情:

public enum SearchResultsOrder {
  SearchResultsOrderAlphabetical,
  SearchResultsOrderPrice;
}

public class SearchQuery
  private SearchResultsOrder searchResultsOrder;

  public SearchResultsOrder getSearchResultsOrder() {
    return this.searchResultsOrder;
  }
}

- 如您所见,编译器可以强制执行枚举和成员变量类型之间的关系。什么是Objective-C等价物?

提前致谢。

2 个答案:

答案 0 :(得分:3)

你正朝着正确的方向前进。您应该typedef枚举,以便将它们用作类型:

typedef NS_ENUM(NSInteger, SPSSearchResultsOrder) {
    SPSSearchResultsOrderAlphabetical,
    SPSSearchResultsOrderPrice
};

@interface SPSSearchQuery : NSObject

@property (nonatomic, readonly, assign) SPSSearchResultsorder searchResultsOrder;

@end

此外,由于您的属性不是对象而是类型值(在您的情况下为NSInteger),因此您应使用assign关键字。此关键字选择退出为此属性生成的ARC内存管理setter / getter。

NS_ENUM宏实际上是一种首选的方式来声明Cocoa中的枚举。使用该方法,您将在Xcode中收到 typechecking 代码完成。如果你看一下Apple的框架,你会发现它在任何地方都被使用而不是简单的枚举。尊重平台的编码风格! :)

答案 1 :(得分:1)

如果您使用NSInteger来定义枚举,我认为应该是NS_ENUM

但是我从不使用NS_ENUM而更喜欢普通的C语法,这更简单,意味着可以使用正确的类型:

enum SPSSearchResultsOrder {
  SPSSearchResultsOrderAlphabetical,
  SPSSearchResultsOrderPrice
};

...

@property (readonly, nonatomic) SPSSearchResultsOrder searchResultsOrder;

(请注意您的代码中有SPSSearchResultsorder。)