获取带有字符串扩展名的枚举的索引,

Joh*_*n S 5 indexing enums swift

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

enum Status: String {
    case online = "online"
    case offline = "offline"
    case na = "na"
}
Run Code Online (Sandbox Code Playgroud)

我需要String值,而且我知道如何获取它,但是我的问题是,对于枚举中的每种情况,是否也可以获得索引值。

0表示在线,1表示离线,2表示不适用。

我将来会增加更多雕像。

Doc*_*oca 9

@JMI 在Swift 5 中的出色回答。

extension CaseIterable where Self: Equatable {

    var index: Self.AllCases.Index? {
        return Self.allCases.firstIndex { self == $0 }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用:

guard let enumCaseIndex = MyEnum.index else { return } // enumCaseIndex: Int
Run Code Online (Sandbox Code Playgroud)


Duy*_*Hoa 5

由于enumSwift 没有其值的索引(请阅读Martin R的评论中的帖子),您必须为自己创建一些“索引”函数或将所有值映射到数组才能具有索引。

您可以按照这篇文章或其他方式实施:

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)
Run Code Online (Sandbox Code Playgroud)


JMI*_*JMI 5

--------更新-------

从Swift 4.2开始,您可以执行以下操作:

enum Status: String, CaseIterable {

    case online
    case offline
    case na
}

extension CaseIterable where Self: Equatable {

    var index: Self.AllCases.Index? {
        return Self.allCases.index { self == $0 }
    }
}

Run Code Online (Sandbox Code Playgroud)

或如我先前所写:

enum Status: Int {

    case online = 0
    case offline
    case na

    var index: Int {
        return rawValue
    }
    var value: String {
        return String(describing: self)
    }
}

Run Code Online (Sandbox Code Playgroud)

--------原始答案-------

我正在使用此扩展程序:

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 }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是您将定义allValues变量:

enum Status: String, EnumIterable {

    case online = "online"
    case offline = "offline"
    case na = "na"

    static var allValues: [Status] {
        return [
            .online,
            .offline,
            .na,
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

此处已解决类似问题(枚举数): 如何获得Swift枚举的计数?

下一种可能性是这样定义枚举:

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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

注意:要定义字符串值,可以使用 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Bil*_*lal 1

这个怎么样。

enum Status: Int {
    case online = 0
    case offline = 1
    case na = 2
}
Run Code Online (Sandbox Code Playgroud)

您可以获得字符串值和整数索引。

// enum as string 
let enumName = "\(Status.online)" // `online`

// enum as int value 
let enumValue = Status.online.rawValue // 0

// enum from int
let enumm = Status.init(rawValue: 1)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。谢谢。