मेरे पास 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 के लिए समान विवरण का उपयोग कैसे करूं?

0
Joakim Sjöstedt 18 जिंदा 2021, 13:08

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   
}
1
Dávid Pásztor 18 जिंदा 2021, 17:10
एक ध्वनि दृष्टिकोण की तरह लगता है, लेकिन मुझे अभी भी वही त्रुटि मिलती है: "सदस्य 'x' के संदर्भ में प्रासंगिक आधार का अनुमान नहीं लगा सकता" क्योंकि एक्सटेंशन एनम से अनजान हैं। मैं उन्हें एनम से कैसे अवगत कराऊं?
 – 
Joakim Sjöstedt
18 जिंदा 2021, 16:13
मेरा अद्यतन उत्तर जांचें, अब इसे ठीक काम करना चाहिए
 – 
Dávid Pásztor
18 जिंदा 2021, 17:10