Si j'ai une énumération avec les cas a, b, c, d est-il possible pour moi de transtyper la chaîne "a" comme énumération?
Réponses:
Sûr. Les énumérations peuvent avoir une valeur brute. Pour citer les documents:
Les valeurs brutes peuvent être des chaînes, des caractères ou tout type de nombre entier ou à virgule flottante
- Extrait de: Apple Inc. «The Swift Programming Language». iBooks. https://itun.es/us/jEUH0.l ,
Vous pouvez donc utiliser un code comme celui-ci:
enum StringEnum: String
{
case one = "one"
case two = "two"
case three = "three"
}
let anEnum = StringEnum(rawValue: "one")!
print("anEnum = \"\(anEnum.rawValue)\"")
Remarque: vous n'avez pas besoin d'écrire = "un" etc. après chaque cas. Les valeurs de chaîne par défaut sont les mêmes que les noms de cas, donc l'appel .rawValue
retournera simplement une chaîne
Si vous avez besoin que la valeur de chaîne contienne des éléments tels que des espaces qui ne sont pas valides dans le cadre d'une valeur de cas, vous devez définir explicitement la chaîne. Alors,
enum StringEnum: String
{
case one
case two
case three
}
let anEnum = StringEnum.one
print("anEnum = \"\(anEnum)\"")
donne
anEnum = "un"
Mais si vous souhaitez case
one
afficher la «valeur un», vous devrez fournir les valeurs de chaîne:
enum StringEnum: String
{
case one = "value one"
case two = "value two"
case three = "value three"
}
Hashable
type.
case one = "uno"
. Maintenant, comment analyser la "one"
valeur enum? (impossible d'utiliser les fichiers bruts, car ils sont utilisés pour la localisation)
= "one"
etc. après chaque cas. Les valeurs de chaîne par défaut sont les mêmes que les noms de cas.
Tout ce dont tu as besoin c'est:
enum Foo: String {
case a, b, c, d
}
let a = Foo(rawValue: "a")
assert(a == Foo.a)
let 💩 = Foo(rawValue: "💩")
assert(💩 == nil)
Dans Swift 4.2, le protocole CaseIterable peut être utilisé pour une énumération avec rawValues, mais la chaîne doit correspondre aux étiquettes de cas 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 }
}
}
usage:
print(MyCode.withLabel("one")) // Optional(MyCode.one)
print(MyCode(rawValue: "uno")) // Optional(MyCode.one)
Dans le cas d'une énumération avec le type Int, vous pouvez le faire:
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
}
}
Et utilise:
let string = "Two"
if let item = MenuItem.enumFromString(string) {
//in this case item = 1
//your code
}
enumFromString
méthode pour chaque énumération que vous utilisez semble fou.
Prolonger la réponse de 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
}
}
Pour Int enum et leur représentation String, je déclare enum comme suit:
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
}
}
}
Usage:
order.orderState = OrderState.waiting.rawValue
let orderState = OrderState.init(rawValue: order.orderState)
let orderStateStr = orderState?.description ?? ""
print("orderStateStr = \(orderStateStr)")