मेरे पास enum
का उपयोग class
DoorModeModel
में किया गया है:
enum DoorModeName: String {
case off = "MODE_OFF"
case exit = "MODE_EXIT"
case auto = "MODE_AUTO"
case partial = "MODE_PARTIAL"
case open = "MODE_OPEN"
}
फिर ऐप में दो अलग-अलग लक्ष्य हैं जो अलग-अलग विवरण का उपयोग करते हैं। मैंने इन्हें लक्ष्य के आधार पर एक्सटेंशन में रखा है:
extension DoorModeModel.DoorModeName {
var presentableName: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
}
}
}
फिर दूसरा विस्तार:
extension DoorModeModel.DoorModeName {
var presentableName: String {
switch self {
case .off: return "MODE_OFF_2".localized()
case .exit: return "MODE_EXIT_2".localized()
case .auto: return "MODE_AUTO_2".localized()
case .partial: return "MODE_PARTIAL_2".localized()
case .open: return "MODE_OPEN_2".localized()
}
}
}
बहुत अच्छा काम करता है। फिर एक समान, लेकिन थोड़ा भिन्न enum
ऐप के दूसरे भाग में उपयोग किया जाता है, DoorModeService
:
enum OperatingModeName: Int {
case off = 0
case exit = 1
case auto = 2
case partial = 3
case open = 4
}
पहले की तरह, target
के आधार पर अलग-अलग विवरण हैं। और पहले की तरह मैंने उनके लिए extensions
बनाया। कोड बिल्कुल ऊपर दिए गए दो extensions
के समान है, एक अलग enum
को बढ़ाने के लिए सहेजें:
extension DoorModeService.OperatingModeName {
var description: String {
switch self {
...
मुझे डुप्लिकेट कोड नहीं चाहिए, इसलिए मैं दोनों enums
के लिए समान enum
विवरण का उपयोग करने का तरीका खोजने का प्रयास कर रहा हूं। मैंने सोचा था कि protocol extensions
का उपयोग करके ऐसा करना संभव होगा, लेकिन चूंकि extensions
enums,
के बारे में नहीं जानते हैं, इसलिए मुझे नहीं लगता कि यह कैसे काम करेगा:
protocol EnumDescription {
var description: String { get }
}
extension EnumDescription {
var description: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
}
}
}
यह मुझे त्रुटि देता है Cannot infer contextual base in reference to member 'x'
क्या मैं extension
को enums
के अनुरूप करने के लिए सेट करता हूं, कुछ इस तरह:
extension EnumDescription where self == enumSomething
या मैं अपने द्वारा बनाए गए दो enums
के लिए समान विवरण का उपयोग कैसे करूं?
1 उत्तर
आप description
के कार्यान्वयन में उन पर स्विच करने में सक्षम होने के लिए अपने प्रोटोकॉल पर 2 enum
के बीच सभी सामान्य मामलों के लिए static
प्रकार के साथ Self
संपत्ति आवश्यकताएं बना सकते हैं।
protocol ModeName: CustomStringConvertible, Equatable {
static var off: Self { get }
static var exit: Self { get }
static var auto: Self { get }
static var partial: Self { get }
static var open: Self { get }
}
extension ModeName {
var description: String {
switch self {
case .off: return "MODE_OFF".localized()
case .exit: return "MODE_EXIT".localized()
case .auto: return "MODE_AUTO".localized()
case .partial: return "MODE_PARTIAL".localized()
case .open: return "MODE_OPEN".localized()
default:
return ""
}
}
}
enum DoorModeName: String, ModeName {
case off = "MODE_OFF"
case exit = "MODE_EXIT"
case auto = "MODE_AUTO"
case partial = "MODE_PARTIAL"
case open = "MODE_OPEN"
}
enum OperatingModeName: Int, ModeName {
case off = 0
case exit = 1
case auto = 2
case partial = 3
case open = 4
}
संबंधित सवाल
नए सवाल
ios
iOS, Apple iPhone, iPod टच और iPad पर चलने वाला मोबाइल ऑपरेटिंग सिस्टम है। IOS प्लेटफॉर्म पर प्रोग्रामिंग से संबंधित प्रश्नों के लिए इस टैग [ios] का उपयोग करें। उन प्रोग्रामिंग भाषाओं के लिए विशिष्ट मुद्दों के लिए संबंधित टैग [उद्देश्य-सी] और [स्विफ्ट] का उपयोग करें।