Якщо у мене є перелік із випадками a, b, c, d, чи можна мені відкинути рядок "a" як перерахування?
Відповіді:
Звичайно. Перерахування можуть мати вихідну вартість. Щоб процитувати документи:
Сировинними значеннями можуть бути рядки, символи або будь-який з цілих чи типів чисел із плаваючою комою
- Витяг від: Apple Inc. “Швидка мова програмування”. 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)\"")
Примітка: Вам не потрібно писати = "один" тощо після кожного випадку. Значення рядка за замовчуванням такі самі, як імена регістрів, тому виклик .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"
значення перерахування? (не можна використовувати сирі, як вони використовуються для локалізації)
= "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
методу для кожного використовуваного переліку здається божевільним.
Розширення відповіді Дункана С.
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)
}
}
Свіфт 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 та їх представлення String я оголошую 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)")