حلول للحصول على Enum من قيم خامة تحتوي على فراغات في لغة Swift
في لغة برمجة Swift، يمكنك الحصول على قيمة enum من خلال القيمة النصية الخام (raw value) باستخدام ميزة البحث (initialization) التي تقدمها Swift. ومن الواضح أن الطريقة الحالية لديك تعمل جيدًا للقيم النصية البسيطة، ولكن تظهر مشكلة عندما يحتوي النص على فراغات.
لتجاوز هذا التحدي، يمكنك استخدام دالة تحويل النص إلى enum بشكل أكثر دقة. يمكنك تحقيق ذلك عبر القيام ببحث يدوي للقيم النصية في enum وتحويلها إلى القيم المناسبة. فيما يلي كود Swift يقوم بذلك:
swiftenum 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"
}
}
init?(rawValue: String) {
switch rawValue {
case TestEnum.Name.rawValue:
self = .Name
case TestEnum.Gender.rawValue:
self = .Gender
case TestEnum.Birth.rawValue, "Birth Day":
self = .Birth
default:
return nil
}
}
}
let name = TestEnum(rawValue: "Name") // Name
let gender = TestEnum(rawValue: "Gender") // Gender
let birth = TestEnum(rawValue: "Birth Day") // Birth
في هذا الكود، تم إضافة دالة init?(rawValue:)
إلى enum، وتتيح هذه الدالة تحويل القيم النصية إلى enum. يتم إجراء البحث يدويًا في القيم النصية ومطابقتها مع القيم في enum، ويتم التعامل بشكل خاص مع القيمة “Birth Day” لضمان التطابق الصحيح.
باستخدام هذا الكود، يمكنك الآن الحصول على قيمة enum بنجاح حتى عندما تحتوي القيمة النصية على فراغات.
المزيد من المعلومات
في Swift، يمكن الوصول إلى قيم الـ Enums عبر القيم الخامة (raw values) باستخدام ميزة rawValue
، كما في الشيفرة المقدمة. ومع ذلك، يبدو أن هناك مشكلة عند استخدام قيمة نصية تحتوي على فراغات، حيث يعيد rawValue
قيمة nil
في هذه الحالة.
لتجاوز هذه المشكلة، يمكنك استخدام إمكانية مخصصة لتحويل النص إلى Enum بحيث يتم تجاوز المشكلة المتعلقة بالفراغات. يمكنك تحديد دالة داخلية في الـ Enum تقوم بتحويل النص المعطى إلى Enum محدد. على سبيل المثال:
swiftenum 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"
}
}
static func enumFromRawValue(_ rawValue: String) -> TestEnum? {
switch rawValue {
case "Name": return .Name
case "Gender": return .Gender
case "Birth Day": return .Birth
default: return nil
}
}
}
let name = TestEnum.enumFromRawValue("Name") // Name
let gender = TestEnum.enumFromRawValue("Gender") // Gender
let birth = TestEnum.enumFromRawValue("Birth Day") // Birth
باستخدام هذا النهج، يمكنك الآن الحصول على Enum حتى في حالة القيم التي تحتوي على فراغات. يتم ذلك من خلال استخدام الدالة enumFromRawValue
المضافة إلى الـ Enum لتحويل النص إلى قيمة Enum المطابقة.