webentwicklung-frage-antwort-db.com.de

Wie erhält man in Swift Enum vom Rohwert?

Ich versuche, den Aufzählertyp vom Rohwert zu erhalten:

enum TestEnum: String {
    case Name
    case Gender
    case Birth

    var rawValue: String {
        switch self {
        case .Name: return "Name"
        case .Gender: return "Gender"
        case .Birth: return "Birth Day"
        }
    }
}

let name = TestEnum(rawValue: "Name")       //Name
let gender = TestEnum(rawValue: "Gender")   //Gender

Es scheint jedoch, dass rawValue nicht für Zeichenfolgen mit Leerzeichen funktioniert:

let birth = TestEnum(rawValue: "Birth Day") //nil

Irgendwelche Vorschläge, wie man es bekommt?

51
Leo

Zu kompliziert, ordnen Sie einfach die Rohwerte direkt den Fällen zu

enum TestEnum: String {
  case Name = "Name"
  case Gender = "Gender"
  case Birth = "Birth Day"
}

let name = TestEnum(rawValue: "Name")!       //Name
let gender = TestEnum(rawValue: "Gender")!   //Gender
let birth = TestEnum(rawValue: "Birth Day")! //Birth

Wenn der Fallname mit dem Rohwert übereinstimmt, können Sie ihn auch weglassen

enum TestEnum: String {
  case Name, Gender, Birth = "Birth Day"
}

In Swift 3+ sind alle Enumerationsfälle lowercased

87
vadian

Vollständiges Arbeitsbeispiel:

enum TestEnum: String {
    case name = "A Name"
    case otherName
    case test = "Test"
}

let first: TestEnum? = TestEnum(rawValue: "A Name")
let second: TestEnum? = TestEnum(rawValue: "OtherName")
let third: TestEnum? = TestEnum(rawValue: "Test")

print("\(first), \(second), \(third)")

Alle funktionieren, aber bei der Initialisierung mit einem Rohwert ist dies optional. Wenn dies ein Problem ist, können Sie einen Initialisierer oder Konstruktor für die Aufzählung erstellen, um dies zu versuchen und zu behandeln, indem Sie einen none-Fall hinzufügen und zurückgeben, wenn die Aufzählung nicht erstellt werden konnte. Etwas wie das:

static func create(rawValue:String) -> TestEnum {
        if let testVal = TestEnum(rawValue: rawValue) {
            return testVal
        }
        else{
            return .none
        }
    }
9
PeejWeej

Sie können enum definieren so - 

enum TestEnum: String {
    case Name, Gender, Birth
}

ODER

enum TestEnum: String {
    case Name
    case Gender
    case Birth
}

sie können eine init-Methode angeben, die Standardwerte zu einem der Member-Werte führt.

enum TestEnum: String {
    case Name, Gender, Birth

    init() {
        self = .Gender
    }
}

Im obigen Beispiel hat TestEnum.Name den impliziten Rohwert "Name" und so weiter.

Der Rohwert eines Aufzählungsfalls wird mit seiner rawValue-Eigenschaft aufgerufen:

let testEnum = TestEnum.Name.rawValue
// testEnum is "Name"
let testEnum1 = TestEnum() 
// testEnum1 is "Gender"
3

Hier ist ein Beispiel für mehr verwendbaren Code in Swift 4.1

import UIKit

enum FormData {
  case userName
  case password

  static let array = [userName, password]

  var placeHolder: String {
    switch self {
    case .userName:
      return AppString.name.localized // will return "Name" string
    case .password:
      return AppString.password.localized // will return "Password" string
    }
  }
}

enum AppString: String {
  case name = "Name"
  case password = "Password"

  var localized: String {
    return NSLocalizedString(self.rawValue, comment: "")
  }
}
0
GSK

Mit Swift 4.2 und CaseIterable Protokoll ist es gar nicht so schwer!

Hier ist ein Beispiel für die Implementierung.

import UIKit

private enum DataType: String, CaseIterable {
    case someDataOne = "an_awesome_string_one"
    case someDataTwo = "an_awesome_string_two"
    case someDataThree = "an_awesome_string_three"
    case someDataFour = "an_awesome_string_four"

    func localizedString() -> String {
        // Internal operation
        // I have a String extension which returns its localized version
        return self.rawValue.localized
    }

    static func fromLocalizedString(localizedString: String) -> DataType? {
        for type in DataType.allCases {
            if type.localizedString() == localizedString {
                return type
            }
        }
        return nil
    }

}

// USAGE EXAMPLE
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let dataType = DataType.fromLocalizedString(localizedString: self.title) {
        loadUserData(type: dataType)
    }
}

Sie können ihn leicht ändern, um den Datentyp basierend auf dem rawValue zurückzugeben. Ich hoffe, es hilft!

0
BelfDev

Ich denke, dies ist eine schnelle und saubere Lösung für Swift 4.2 (Sie können zum Spielplatz c & p)

import UIKit

public enum SomeEnum: String, CaseIterable {
    case Sun,moon,venus,pluto
}

let str = "venus"
let newEnum = SomeEnum.allCases.filter{$0.rawValue == str}.first
// newEnum is optional
if let result = newEnum {
    print(result.rawValue)
}
0
Zvika Ashkenazi

Zeigen Sie den Rohwert mit Enum an

import UIKit

enum car: String {
    case bmw =  "BMW"
    case jaquar = "JAQUAR"
    case rd = "RD"
    case benz = "BENZ"

}


class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        label.text = car.bmw.rawValue

    }


}
0
CSE 1994