我有一个看起来像这样的枚举:
enum Status: String {
case online = "online"
case offline = "offline"
case na = "na"
}
我需要String值,我知道如何获取它,但我的问题是,是否有可能为枚举中的每个案例获取索引值。
0表示在线,1表示离线,2表示na。
我将来会添加更多雕像。
答案 0 :(得分:2)
我确实使用了一种解决方案,女巫与santhosh-shettigar几乎相同:
func toInt() -> Int {
let allValues: NSArray = MyEnum.allCases as NSArray
let result: Int = allValues.index(of: self)
return result
}
简单!我使用了Swift内置的MyEnum.allCases
,...但是我不确定在Swift Specification中,我们是否可以保证MyEnum.allCases
返回的数组总是 < / em> 的顺序相同,即MyEnum
定义中使用的顺序?
答案 1 :(得分:1)
这个怎么样?
public int FindLogarithmicGood(int value)
{
int lo = 0;
int hi = _bitonic.Length - 1;
int mid;
while (hi - lo > 1)
{
mid = lo + ((hi - lo) / 2);
if (value < _bitonic[mid])
{
return DownSearch(lo, hi - lo + 1, mid, value);
}
else
{
if (_bitonic[mid] < _bitonic[mid + 1])
lo = mid;
else
hi = mid;
}
}
return _bitonic[hi] == value
? hi
: _bitonic[lo] == value
? lo
: -1;
}
您可以获取字符串值和整数索引。
public int DownSearch(int index, int count, int mid, int value)
{
int result = BinarySearch(index, mid - index, value);
if (result < 0)
result = BinarySearch(mid, index + count - mid, value, false);
return result;
}
希望它有所帮助。谢谢。
答案 2 :(得分:1)
由于Swift中的enum
没有其值的索引(请阅读 Martin R 的评论中的帖子),您必须创建自己的“索引”功能或将所有值映射到Array以获得索引。
您可以按照此帖或其他方式实施:
enum Status: String {
case online = "online"
case offline = "offline"
case na = "na"
static func index(of aStatus: Status) -> Int {
let elements = [Status.online, Status.offline, Status.na]
return elements.index(of: aStatus)!
}
static func element(at index: Int) -> Status? {
let elements = [Status.online, Status.offline, Status.na]
if index >= 0 && index < elements.count {
return elements[index]
} else {
return nil
}
}
}
let a = Status.na
//return 2
let index = Status.index(of: a)
//return Status.offline
let element2 = Status.element(at: 1)
//return nil
let element3 = Status.element(at: 3)
答案 3 :(得分:1)
@JMI在 Swift 5 中的好答案。
extension CaseIterable where Self: Equatable {
var index: Self.AllCases.Index? {
return Self.allCases.firstIndex { self == $0 }
}
}
答案 4 :(得分:0)
我正在使用此扩展程序:
protocol EnumIterable: RawRepresentable {
static var allValues: [Self] { get }
var index: Int? { get }
}
extension EnumIterable {
static var count: Int {
return allValues.count
}
}
extension EnumIterable where Self.RawValue: Equatable {
var next: Self? {
if let index = Self.allValues.index(where: { rawValue == $0.rawValue }) {
return Self.allValues[safe: index + 1]
}
return nil
}
var index: Int? {
return Self.allValues.index { rawValue == $0.rawValue }
}
}
但是你要定义allValues变量:
enum Status: String, EnumIterable {
case online = "online"
case offline = "offline"
case na = "na"
static var allValues: [Status] {
return [
.online,
.offline,
.na,
]
}
}
此处解决了类似问题(枚举计数): How do I get the count of a Swift enum?
下一种可能性是定义这样的枚举:
enum Status: Int {
case online = 0
case offline
case na
var index: Int {
return rawValue
}
var value: String {
return String(describing: self)
}
}
print (Status.online.value) // online
print (Status.online.index) // 0
或
enum Status: Int {
case online = 0
case offline
case na
var index: Int {
return rawValue
}
var value: String {
switch self {
case .online:
return "online"
case .offline:
return "offline"
case .na:
return "na"
}
}
}
print (Status.online.value) // online
print (Status.online.index) // 0
注意:要定义字符串值,可以使用CustomStringConvertible
协议。
例如:
enum Status: Int, CustomStringConvertible {
case online = 0
case offline
case na
var index: Int {
return rawValue
}
var description: String {
switch self {
case .online:
return "online"
case .offline:
return "offline"
case .na:
return "na"
}
}
}
答案 5 :(得分:0)
可能的解决方法可能是将自定义函数与枚举关联
enum ToolbarType : String{
case Case = "Case", View="View", Information="Information"
static let allValues = [Case, View, Information]
func ordinal() -> Int{
return ToolbarType.allValues.index(of: self)!
}
}
可以用作
for item in ToolbarType.allValues {
print("\(item.rawValue): \(item.ordinal())")
}
输出
Case: 0
View: 1
Information: 2