मेरे पास एक स्विफ्ट व्याकरण प्रश्न है। मेरे पास फ़ंक्शन में एक स्विच केस है, और मुझे नेस्टेड स्विच केस को नीचे जैसा कुछ बनाना होगा।

func changeIcon(status: String){
    switch status {
    case "ready", "recording", "finished", "error":
        if indicator.isAnimating {
            indicator.stopAnimating()
            indicator.hidesWhenStopped = true
        }
        indicator.isHidden = true
        symbolImageView.isHidden = false
        
        switch status{
        case "ready":
            symbolImageView.image = Images.streamIsReady
        case "recording":
            symbolImageView.image = Images.streamIsOngoing
        case "finished":
            symbolImageView.image = Images.close
        case "error":
            symbolImageView.image = Image.error
        default:
            print("default")
        }
        
    case "init":
        symbolImageView.isHidden = true
        indicator.isHidden = false
        indicator.startAnimating()
    
    default:
        print("default")
    }
}

मैं एक स्विच केस का उपयोग करना चाहता हूं (या यदि यह संभव है तो कथन भी ठीक है) यह जांचने के लिए कि क्या मैं UIimage या UIActivityIndicator प्रदर्शित करता हूं, और फिर यह निर्धारित करने के लिए कि मुझे कौन सा UIImage प्रदर्शित करना चाहिए, एक और स्विच केस का उपयोग करें। मैं सोच रहा था कि क्या नेस्टेड स्विच केस का उपयोग करना बेमानी है और उसी चीज़ को प्राप्त करने का एक वैकल्पिक तरीका है।

0
Yuuu 25 नवम्बर 2021, 10:34
सबसे पहले, आपको एक enum का उपयोग करना चाहिए। यह देखता है कि init एनम का हिस्सा बिल्कुल नहीं होना चाहिए।
 – 
Sulthan
25 नवम्बर 2021, 10:38

2 जवाब

सबसे बढ़िया उत्तर

आप एक फ़ंक्शन जोड़ सकते हैं, उदाहरण के लिए

func changeIcon(status: String) {
    switch status{
    case "ready":
        updateImage(.streamIsReady)
    case "recording":
        updateImage(.streamIsOngoing)
    case "finished":
        updateImage(.close)
    case "error":
        updateImage(.error)
        
    case "init":
        symbolImageView.isHidden = true
        indicator.isHidden = false
        indicator.startAnimating()
        
    default:
        print("default")
    }
}

func updateImage(_ image : Images){
    if indicator.isAnimating {
        indicator.stopAnimating()
        indicator.hidesWhenStopped = true
    }
    indicator.isHidden = true
    symbolImageView.isHidden = false
    symbolImageView.image = image
}

और मैं सुल्तान से सहमत हूं: एक स्ट्रिंग के बजाय एक एनम का उपयोग करें

2
vadian 25 नवम्बर 2021, 10:56

सबसे पहले, आपके पास एक enum होना चाहिए:

enum Status: String {
   // "init" renamed to "loading"
   case loading, ready, recording, finished, error

   var icon: UIImage? {
       switch self {
       case .loading:
           return nil
       case .ready:
           return Images.streamIsReady
       case .recording:
           return Images.streamIsOngoing
       case .finished:
           return Images.close
       case .error:
           return Image.error
       }
   }
}

तब आपका कोड बन सकता है:

func changeIcon(status: Status) {
    if status == .loading {
       indicator.startAnimating()
    } else {
       indicator.stopAnimating()
    }

    let icon = status.icon
    symbolImageView.isHidden = icon == nil
    symbolImageView.image = icon
}

स्टेटमेंट indicator.hidesWhenStopped = true आपके व्यू सेटअप का हिस्सा होना चाहिए न कि इस फंक्शन के अंदर।

1
Sulthan 25 नवम्बर 2021, 10:46
Enum के लिए स्ट्रिंग मान होने का कोई अच्छा कारण भी नहीं है। लेकिन किसी भी तरह से, एनम का मतलब है कि आपके पास वर्तनी के माध्यम से अमान्य मामले नहीं हो सकते हैं।
 – 
gnasher729
25 नवम्बर 2021, 11:04
ठीक है, RawRepresentable समानता को भी परिभाषित करता है लेकिन आप सही कह रहे हैं कि मैं केवल Equatable का उपयोग कर सकता था। मैं आमतौर पर अपने कोड में String एनम पसंद करता हूं।
 – 
Sulthan
25 नवम्बर 2021, 11:17