swift - enum विधि एक गतिशील प्रकार की वापसी



enums (1)

मुझे लगता है कि इस समस्या का मूल यह है कि स्विफ्ट की सख्त टाइपिंग है इसका अर्थ है कि संकलन के समय में प्रकारों को ज्ञात होना चाहिए। यह स्पष्ट रूप से कानूनी है:

let s : Any = "howdy"
if let ss = s as? String {
    print(ss)
}

लेकिन यह कानूनी नहीं है:

let s : Any = "howdy"
let someType = String.self
if let ss = s as? someType { // *
    print(ss)
}

कुछ प्रकार एक प्रकार का होना चाहिए; यह अपने भीतर एक प्रकार को छिपाने वाला कोई चर नहीं हो सकता। लेकिन यह ठीक है, वास्तव में, आप वास्तव में क्या करने को कह रहे हैं

मेरे पास एक एन्यूम है और मैं हर मामले के लिए एक अलग प्रकार की वापसी के लिए एक विधि बनाना चाहता हूं।

उदाहरण के लिए, मेरे पास एक शब्दकोष है [String: Any] मूल्यों को संसाधित करने के लिए मैं कुंजी का एक सरणी बनाने के लिए enum का उपयोग कर रहा हूं:

enum Foo {
    case option1
    case option2

    func createKey() -> [String] {
        switch self {
        case .option1: return ["scenario1"]
        case .option2: return ["scenario2"]
        }
    }
}

मेरे पास मूल्य होने के बाद, मुझे उनको उचित प्रकार के लिए उपयोग करने के लिए उन्हें डालने की आवश्यकता है। अभी मैं इसे मैन्युअल रूप से if-statements का उपयोग कर रहा हूं लेकिन यह बहुत सारे कोड कम कर सकता है अगर मैं उचित तरीके से वापस जाने के लिए किसी भी तरह से एक विधि बना सकता हूं। मेरा वर्तमान कोड:

let origin: [String: Any] = ["scenario2": "someText"]
let option: Foo = .option2

option.createKey().forEach {
    guard let rawValue = origin[$0] else { return }

    switch option {
    case .option1:
        guard let value = rawValue as? Int else { return }
        print("Value is an Int:", value)
    case .option2:
        guard let value = rawValue as? String else { return }
        print("Value is a String:", value)
    }
}

मैं क्या हासिल करना चाहूंगा:

option.createKey().forEach {
    guard let rawValue = origin[$0] as? option.getType() else { return }
}

क्या यह संभव है?





enums