Michael Shobique
Michael Shobique

Reputation: 23

How to fix the error "Function declares an opaque return type, but the return statements in its body do not have matching underlying types"?

import SwiftUI

struct FRemoteImage: View {

@ObservedObject var imageLoader = ImageLoader()

var placeholder:Image

init(url: String, placeholder: Image = Image(systemName: "photo")) {
    self.placeholder = placeholder
    imageLoader.fetchImage(url: url)
}

var body: some View {
    if let image = self.imageLoader.downloadImage {
        return Image(uiImage: image)
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 55, height: 60, alignment: .center)
    }
    return placeholder
}

}

struct FRemoteImage_Previews: PreviewProvider { static var previews: some View { FRemoteImage(url: "") } }

Upvotes: 1

Views: 1384

Answers (1)

jnpdx
jnpdx

Reputation: 52312

body in a SwiftUI is a ViewBuilder (which is a type of ResultBuilder), which has some special properties. To take advantage of it, you'll want to remove your explicit return statements and let it return a view hierarchy implicitly instead:

var body: some View {
    if let image = self.imageLoader.downloadImage {
        Image(uiImage: image) //<-- This gets returned
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 55, height: 60, alignment: .center)
    } else {
        placeholder  //<-- or, this gets returned
    }
}

Upvotes: 4

Related Questions