ถ้าฉันมี enum กับกรณี a, b, c, d เป็นไปได้ไหมที่ฉันจะร่ายสตริง "a" เป็น enum?
ถ้าฉันมี enum กับกรณี a, b, c, d เป็นไปได้ไหมที่ฉันจะร่ายสตริง "a" เป็น enum?
คำตอบ:
แน่นอน Enums สามารถมีค่าดิบ ในการอ้างอิงเอกสาร:
ค่าดิบอาจเป็นสตริงอักขระหรือประเภทตัวเลขจำนวนเต็มหรือทศนิยมใด ๆ ก็ได้
- ข้อความที่ตัดตอนมาจาก: Apple Inc. “ The Swift Programming Language” 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
จะส่งคืนสตริง
หากคุณต้องการให้ค่าสตริงมีสิ่งต่างๆเช่นช่องว่างที่ไม่ถูกต้องเป็นส่วนหนึ่งของค่าเคสคุณต้องตั้งค่าสตริงอย่างชัดเจน ดังนั้น,
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"
เป็นค่า enum ได้อย่างไร? (ใช้ดิบไม่ได้เนื่องจากใช้สำหรับการแปลภาษา)
= "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 สามารถใช้กับ enum ที่มี rawValues ได้ แต่สตริงควรตรงกับเลเบลเคส enum:
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)
ในกรณีที่ enum มีประเภท 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
วิธีการสำหรับแต่ละ enum ที่คุณใช้ดูเหมือนจะบ้า
ขยายคำตอบของ Duncan 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 และการแสดงสตริงของพวกเขาฉันประกาศ enum ดังนี้:
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)")
ใช้คำตอบของ djruss70 เพื่อสร้างโซลูชันที่มีลักษณะทั่วไปสูง:
extension CaseIterable {
static func from(string: String) -> Self? {
return Self.allCases.first { string == "\($0)" }
}
func toString() -> String { "\(self)" }
}
การใช้งาน:
enum Chassis: CaseIterable {
case pieridae, oovidae
}
let chassis: Chassis = Chassis.from(string: "oovidae")!
let string: String = chassis.toString()
หมายเหตุ: สิ่งนี้จะใช้ไม่ได้หาก enum ประกาศ @objc เท่าที่ฉันรู้เกี่ยวกับ Swift 5.3 ไม่มีวิธีใดที่จะทำให้สิ่งนี้ทำงานกับ @objc enum ยกเว้นโซลูชัน brute force (คำสั่งสวิตช์)
หากมีคนรู้วิธีทำให้งานนี้กับ @objc enums ฉันจะสนใจคำตอบนี้มาก