如果我有一个用a,b,c,d的枚举,是否可以将字符串“ a”强制转换为枚举?
Answers:
当然。枚举可以具有原始值。引用文档:
原始值可以是字符串,字符或任何整数或浮点数类型
—摘自:Apple Inc.“ Swift编程语言”。iBooks。https://itun.es/us/jEUH0.l,
因此,您可以使用如下代码:
enum StringEnum: String
{
case one = "one"
case two = "two"
case three = "three"
}
let anEnum = StringEnum(rawValue: "one")!
print("anEnum = \"\(anEnum.rawValue)\"")
注意:在每种情况下,您无需写=“ one”等。默认的字符串值与案例名称相同,因此调用.rawValue
只会返回一个字符串
如果您需要字符串值来包含诸如空格之类的无效内容,这些值不能作为case值的一部分,那么您需要显式设置字符串。所以,
enum StringEnum: String
{
case one
case two
case three
}
let anEnum = StringEnum.one
print("anEnum = \"\(anEnum)\"")
给
anEnum =“一个”
但是,如果要case
one
显示“值一”,则需要提供字符串值:
enum StringEnum: String
{
case one = "value one"
case two = "value two"
case three = "value three"
}
Hashable
一种。
case one = "uno"
。现在,如何解析"one"
为枚举值?(不能使用原始数据,因为它们已用于本地化)
= "one"
在每种情况下,您都不需要写等。默认字符串值与案例名称相同。
所有你需要的是:
enum Foo: String {
case a, b, c, d
}
let a = Foo(rawValue: "a")
assert(a == Foo.a)
let 💩 = Foo(rawValue: "💩")
assert(💩 == nil)
在Swift 4.2中,CaseIterable协议可用于具有rawValues的枚举,但是字符串应与枚举的大小写标签匹配:
enum MyCode : String, CaseIterable {
case one = "uno"
case two = "dos"
case three = "tres"
static func withLabel(_ label: String) -> MyCode? {
return self.allCases.first{ "\($0)" == label }
}
}
用法:
print(MyCode.withLabel("one")) // Optional(MyCode.one)
print(MyCode(rawValue: "uno")) // Optional(MyCode.one)
如果是Int类型的枚举,则可以这样做:
enum MenuItem: Int {
case One = 0, Two, Three, Four, Five //... as much as needs
static func enumFromString(string:String) -> MenuItem? {
var i = 0
while let item = MenuItem(rawValue: i) {
if String(item) == string { return item }
i += 1
}
return nil
}
}
并使用:
let string = "Two"
if let item = MenuItem.enumFromString(string) {
//in this case item = 1
//your code
}
enumFromString
为您使用的每个枚举编写方法似乎很疯狂。
扩展邓肯C的答案
extension StringEnum: StringLiteralConvertible {
init(stringLiteral value: String){
self.init(rawValue: value)!
}
init(extendedGraphemeClusterLiteral value: String) {
self.init(stringLiteral: value)
}
init(unicodeScalarLiteral value: String) {
self.init(stringLiteral: value)
}
}
Swift 4.2:
public enum PaymentPlatform: String, CaseIterable {
case visa = "Visa card"
case masterCard = "Master card"
case cod = "Cod"
var nameEnum: String {
return Mirror(reflecting: self).children.first?.label ?? String(describing: self)
}
func byName(name: String) -> PaymentPlatform {
return PaymentPlatform.allCases.first(where: {$0.nameEnum.elementsEqual(name)}) ?? .cod
}
}
对于Int枚举及其字符串表示形式,我将枚举声明如下:
enum OrderState: Int16, CustomStringConvertible {
case waiting = 1
case inKitchen = 2
case ready = 3
var description: String {
switch self {
case .waiting:
return "Waiting"
case .inKitchen:
return "InKitchen"
case .ready:
return "Ready"
}
}
static func initialize(stringValue: String)-> OrderState? {
switch stringValue {
case OrderState.waiting.description:
return OrderState.waiting
case OrderState.inKitchen.description:
return OrderState.inKitchen
case OrderState.ready.description:
return OrderState.ready
default:
return nil
}
}
}
用法:
order.orderState = OrderState.waiting.rawValue
let orderState = OrderState.init(rawValue: order.orderState)
let orderStateStr = orderState?.description ?? ""
print("orderStateStr = \(orderStateStr)")