我希望我的类有一个只能从枚举中赋值的属性,但我不能完全理解语法。这是我的头文件:
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等价物?
提前致谢。
答案 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
。)