can i define something like func myRender() -> Image | Text (union-types) ?

大家好.我想我错过了SwiftUI演示中一个无法解决的问题:一个简单的url图像渲染器,带有一个子渲染块,代码如下:

import Foundation
import SwiftUI

struct URLImage: View {
    var urlString: String;
    @State var loaded = false
    @State var error: Any?
    @State var data: Data?

    func didMount() {
        print("!!! viewWillAppear", self.urlString)
        // just load url and get data in the callback fn:
        // (String, (Any?, Data) -> Void) -> Void
        // $0 is error, $1 is data
        loadImage(urlString: self.urlString) {
            print("loaded", $0 ?? "no error", $1)
            self.error = $0
            self.data = $1
            self.loaded = true
        }
    }
    
    // what is the return-type of tryRender ?
    func tryRender() -> View { // doesn't works now because `View` is a protocol
        // self.data maybe nil or with a wrong binary format
        guard let image = try? Image(nsImage: NSImage(data: self.data!)!) else {
//            return Image("image_format_error") // it works with "func tryRender() -> Image" but ... emmm
            return Text("image_format_error") // this is what i want, but this can't works
        }

        return image
    }

    var body: some View {
        self.didMount()
        return VStack {
            if (self.error != nil) {
                Text("URLImage Error")
            } else {
                if (self.loaded) {
                    self.tryRender()
                } else {
                    Text("not loaded")
                }
            }
        }
    }
}

struct URLImage_Previews: PreviewProvider {
    static var previews: some View {
        URLImage(
            urlString: "http://127.0.0.1:3000/0009.jpg"
        )
    }
}

问题是tryRender()的返回类型,我无法编写tryRender() -> Image | Text个像typescript的联合类型来表达我的观点.

图像或文本是否具有使其工作的基本类型?或者有另一种方法来编写这样的子渲染片段func?

推荐答案

您可以使用@ViewBuilder,返回类型应为some View

@ViewBuilder func tryRender() -> some View {
        if let image = try? Image(nsImage: NSImage(data: self.data!)!)  {
            image
        } else {
            Text("image_format_error")
        }
    }

Ios相关问答推荐

如何调整包含extView的UICollectionViewListCell的大小?

iOS中的分段拾取器—手柄点击已 Select 的项目

如何在SWIFT中处理不可发送的类型?

SwiftUI@Observable不跟踪父类属性中的更改以更新视图

删除领域中的cartItem时出现问题

如何在iOS中以编程方式推送另一个页面?

SwiftData在获取值时应用程序崩溃:线程1:EXC_BREAKPOINT(代码=1,子代码=0x101e8303c)

用于HDR显示的CI上下文选项

当文本为空时,具有垂直轴的SwiftUI文本字段不会与FirstTextBaseline对齐

当任何 TextEditor 有多于一行时,所有 TextEditor 都会调整大小

如果使用 .onAppear 设置,为什么 SwiftUI Picker 不显示正确的选定值

CarPlay:现在播放alert 可能吗?

在 SwiftUI 中重构提取到子视图的 GeometryReader 代码

Xcode 13.4.1 (13F100)Command CodeSign 失败,退出代码非零我应该删除哪个证书?

UILabel - 字符串作为文本和链接

如何更新推送通知服务证书

iOS中的apk类似功能是什么?

应用程序不包含正确的测试版权利

Select 器touchesBegan:withEvent:的覆盖方法具有不兼容的类型(NSSet,UIEvent)->()

如何使用完成按钮制作 UIPickerView?