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表示不适用。
我将来会增加更多雕像。
@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)
由于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)
--------更新-------
从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)
这个怎么样。
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)
希望能帮助到你。谢谢。