swiftxcodeswiftuiswiftui-asyncimage

AsyncImage. Cannot use switch statement in Phase closure?


When I use switch statement in phase in asyncImage it gave me this error.

Trailing closure passed to parameter of type 'CGFloat' that does not accept a closure

I understand that docs uses if let statements to extract the image and get the error like here down.

My code:

 AsyncImage(url: URL(string:stringURL)) { phase in
                switch phase {
                    case .empty:
                        ProgressView()
                    case .success(let image):
                        image
                          .scaledToFit()
                    case .failure():
                        EmptyView()
                    }
                  }

As per Apple Docs:

AsyncImage(url: URL(string: "https://example.com/icon.png")) { phase in
    if let image = phase.image {
      image // Displays the loaded image.
     } else if phase.error != nil {
    Color.red // Indicates an error.
      } else {
    Color.blue // Acts as a placeholder.
   }

My question is why I cannot use switch statement here. And what does this error means exactly?

Thanks.


Solution

  • you can use a switch statement, use this, works for me:

    case .failure(_):  // <-- here 
    

    Here is the code I used to show that my answer works:

    struct ContentView: View {
        
        @State private var stringURL = "https://upload.wikimedia.org/wikipedia/commons/e/ef/Red-billed_gull%2C_Red_Zone%2C_Christchurch%2C_New_Zealand.jpg"
        
        var body: some View {
            AsyncImage(url: URL(string: stringURL)) { phase in
                switch phase {
                case .empty:
                    ProgressView()
                case .success(let image):
                    image.resizable().scaledToFit()
                case .failure(_):  // <-- here
                    EmptyView()
                @unknown default:
                    Image(systemName: "exclamationmark.icloud")
                }
            }
        }
        
    }