簡體   English   中英

Swift 中的開關盒內的開關盒

[英]Switch case within switch case in Swift

我有一個 Swift 語法問題。 我在 function 中有一個開關盒,我需要制作一個如下所示的嵌套開關盒。

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")
    }
}

我想使用 switch case(或者如果可能的話,如果語句也可以)來檢查我是否顯示 UIimage 或 UIActivityIndicator,然后使用另一個 switch case 來確定應該顯示哪個 UIImage。 我想知道使用嵌套開關盒是否是多余的,並且有另一種方法可以實現相同的目的。

例如,您可以添加 function

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
}

我同意 Sulthan:使用枚舉而不是字符串

首先,你應該有一個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應該是您的視圖設置的一部分,而不是在此 function 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM