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"
}
}
}
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
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)
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)
6条答案
按热度按时间kiayqfof1#
从swift 4.2开始,您可以执行以下操作:
或者像我之前写的
我用这个分机号:
但您需要定义allValues变量:
这里解决了类似的问题(枚举计数):如何获得Swift枚举的计数?
下一种可能性是像这样定义枚举:
或
注:定义字符串值可以使用
CustomStringConvertible
协议。例如:
pzfprimi2#
使用方法:
aor9mmx13#
由于Swift中的
enum
没有其值的索引(请阅读Martin R评论中的帖子),您必须为自己创建一些“索引”函数或将所有值Map到一个Array以获得索引。你可以像在这篇文章中一样实现,或者用另一种方法来实现:
kh212irz4#
我确实用了一个和桑多什-谢提加差不多的方法:
简单!我使用Swift内置的
MyEnum.allCases
,......但是我不确定在Swift规范中,我们是否保证MyEnum.allCases
返回的数组***总是***相同的顺序,就是MyEnum
定义中使用的顺序???goqiplq25#
不如这样吧
可以同时获得字符串值和整数索引。
希望有用。谢谢。
5lwkijsr6#
可能的解决方法是将自定义函数与枚举关联
可用作
产出