swift 获取扩展名为String的枚举的索引,

b0zn9rqh  于 2022-12-26  发布在  Swift
关注(0)|答案(6)|浏览(144)

我有一个如下所示的枚举:

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

我需要字符串值,我知道如何得到它,但我的问题是是否有可能得到索引值也为每一个情况下的枚举。
0表示联机,1表示脱机,2表示不适用。
以后我会加更多的雕像。

kiayqfof

kiayqfof1#

  • ------更新--------
    从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 }
    }
}

或者像我之前写的

enum Status: Int {

    case online = 0
    case offline
    case na

    var index: Int {
        return rawValue
    }
    var value: String {
        return String(describing: self)
    }
}
  • ------来源答案------
    我用这个分机号:
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,
        ]
    }
}

这里解决了类似的问题(枚举计数):如何获得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

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"
        }
    }
}
pzfprimi

pzfprimi2#

    • Swift 5**中@JMI的回答非常棒。
enum MyEnum: CaseIterable {
  case one
  case two
}

extension CaseIterable where Self: Equatable {
    var index: Self.AllCases.Index? {
        return Self.allCases.firstIndex { self == $0 }
    }
}

使用方法:

guard let enumCaseIndex = MyEnum.one.index else { return }
print("Enum case index: ", \(enumCaseIndex)) // prints: 0
aor9mmx1

aor9mmx13#

由于Swift中的enum没有其值的索引(请阅读Martin R评论中的帖子),您必须为自己创建一些“索引”函数或将所有值Map到一个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)
kh212irz

kh212irz4#

我确实用了一个和桑多什-谢提加差不多的方法:

func toInt() -> Int {
        let allValues: NSArray = MyEnum.allCases as NSArray
        let result: Int = allValues.index(of: self)
        return result
    }

简单!我使用Swift内置的MyEnum.allCases,......但是我不确定在Swift规范中,我们是否保证MyEnum.allCases返回的数组***总是***相同的顺序,就是MyEnum定义中使用的顺序???

goqiplq2

goqiplq25#

不如这样吧

enum Status: Int {
    case online = 0
    case offline = 1
    case na = 2
}

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

// 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)

希望有用。谢谢。

5lwkijsr

5lwkijsr6#

可能的解决方法是将自定义函数与枚举关联

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

相关问题