获取具有String扩展名的枚举索引,

时间:2017-06-09 07:39:42

标签: swift indexing enums

我有一个看起来像这样的枚举:

enum Status: String {
    case online = "online"
    case offline = "offline"
    case na = "na"
}

我需要String值,我知道如何获取它,但我的问题是,是否有可能为枚举中的每个案例获取索引值。

0表示在线,1表示离线,2表示na。

我将来会添加更多雕像。

6 个答案:

答案 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