ios - كيفية الحصول على التعداد من القيمة الخام في سويفت؟




swift enums (5)

أعتقد أن هذا هو حل سريع ونظيف لسريع 4.2 (يمكنك 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)
}

أحاول الحصول على نوع التعداد من القيمة الأولية:

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

ولكن يبدو أن rawValue لا يعمل في السلسلة ذات المسافات:

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

أي اقتراحات كيفية الحصول عليها؟


عرض القيمة الأولية باستخدام التعداد

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

    }


}

مثال عمل كامل:

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)")

سيعمل كل هؤلاء ، ولكن عند التهيئة باستخدام قيمة أولية ، ستكون اختيارية. إذا كانت هذه مشكلة ، فيمكنك إنشاء مُهيئ أو مُنشئ للتعداد لمحاولة التعامل مع ذلك ، وإضافة حالة واحدة وإعادتها إذا تعذر إنشاء التعداد. شيء من هذا القبيل:

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

مع Swift 4.2 وبروتوكول CaseIterable ، ليس من الصعب على الإطلاق!

هنا مثال على كيفية تنفيذه.

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)
    }
}

يمكنك تعديله بسهولة لإرجاع DataType استنادًا إلى rawValue. اتمني ان يكون مفيدا!


يمكنك تحديد التعداد مثل هذا -

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

أو

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

يمكنك توفير طريقة init تخلف أحد القيم الأعضاء.

enum TestEnum: String {
    case Name, Gender, Birth

    init() {
        self = .Gender
    }
}

في المثال أعلاه ، يحتوي TestEnum.Name على قيمة خام ضمنية لـ "الاسم" ، وما إلى ذلك.

يمكنك الوصول إلى القيمة الأولية لحالة التعداد باستخدام خاصية rawValue الخاصة بها:

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




enums