2014-06-17 74 views
0

我希望我的类具有只能从枚举中分配值的属性,但我无法完全理解语法中的语法。这是我的头文件:声明属性类型为枚举值的属性的正确方法

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

如果您在'NS_ENUM'前面添加'typedef',那么您可以将您的枚举类型引用为不带'enum'关键字的'SPSSearchResults'。 – 3329

回答

3

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

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

@interface SPSSearchQuery : NSObject 

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

@end 

也为你的财产(在你的情况NSInteger)持有不是一个对象,而是一种价值,你应该使用assign关键字。此关键字选择为此属性生成的ARC内存管理设置程序/获取程序。

NS_ENUM宏实际上是一个更好的方式来声明可可中的枚举。通过这种方法,您将在Xcode中获得类型检查代码完成。如果你看一下Apple的框架,你会发现它在各处都被使用,而不是普通的枚举。尊重平台的编码风格! :)

+1

是的; 'assign'属性就是这里的关键! – trojanfoe

+0

这是有效的,但有趣的是,它仍然不会将'searchResultsOrder'的值约束到enum中的常量之一。例如,我可以将3分配给支持该属性的实例变量。我可以忍受这一点,因为这项任务只发生在我的班级的初始者身上。 –

1

我相信它应该是NSInteger如果您使用NS_ENUM来定义枚举。

但是我从来没有使用NS_ENUM和喜欢正常的C语法,这是简单,意味着正确的类型可用于:

enum SPSSearchResultsOrder { 
    SPSSearchResultsOrderAlphabetical, 
    SPSSearchResultsOrderPrice 
}; 

... 

@property (readonly, nonatomic) SPSSearchResultsOrder searchResultsOrder; 

(注意,您在您的代码有SPSSearchResultsorder)。

+0

有趣,谢谢。我使用了'NS_ENUM',因为这似乎是现在做事的首选方式:http://nshipster.com/ns_enum-ns_options/ –

+0

@JohnTopley也许。我从来没有碰到它旨在解决的问题,我猜... – trojanfoe

+0

使用NS_ENUM/OPTIONS允许Swift编译器将您的枚举正确地转换为Swift枚举。 – Lance