【问题标题】:generic parameter 'FalseContent' could not be inferred无法推断通用参数“FalseContent”
【发布时间】:2026-01-16 08:30:01
【问题描述】:

我正在尝试创建一个 4x4 的图像网格,我希望它可以从 1 个图像扩展到 4 个图像。

当提供的图像来自常规数组时,此代码有效

var images = ["imageOne", "imageTwo", "imageThree", "imageFour"]

但是,如果数组来自我们绑定的对象,则它不起作用:

@ObjectBinding var images = ImageLoader() //Where our array is in images.images

我的初始化程序如下所示:

init(imageUrls urls: [URL]){
    self.images = ImageLoader(urls)
}

而我的ImageLoader 类看起来像这样:

class ImageLoader: BindableObject {
    var didChange = PassthroughSubject<ImageLoader, Never>()

    var images = [UIImage]() {
        didSet{
            DispatchQueue.main.async {
                self.didChange.send(self)
            }
        }
    }

    init(){

    }

    init(_ urls: [URL]){
        for image in urls{
            //Download image and append to images array
        }
    }
}

问题出现在我的View

var body: some View {
    return VStack {
        if images.images.count == 1{
            Image(images.images[0])
                .resizable()
        } else {
            Text("More than one image")
        }
    }
}

编译时,我收到错误generic parameter 'FalseContent' could not be inferred,其中FalseContent 是SwiftUI buildEither(first:) 函数的一部分。

同样,如果images 不是ImageLoader 的绑定,而是Strings 的常规数组,则它可以正常工作。

我不确定是什么导致了这个问题,它似乎是由绑定引起的,但我不知道该怎么做。

【问题讨论】:

  • 嘿 Kontiki,对不起,你说得对,有错误。我试图让它更简洁,但我会的。修复它
  • 我已经更新了帖子
  • 我想我能够将您的代码重构为可行的东西。很抱歉让您感到痛苦,但请确定:init(imageUrls urls: [URL]) 是您视图的初始化器吗?
  • 是的,这就是初始化程序
  • 知道了,贴出答案。干杯。

标签: swift swiftui


【解决方案1】:

问题是你的 Image 初始化器,你传递了一个 UIImage,所以你应该这样调用它:

Image(uiImage: images.images[0])

请注意,在处理视图时,流控制有点复杂,错误消息可能会产生误导。通过注释您视图的 IF 语句的“else”部分,编译器会向您展示它失败的真正原因。

【讨论】:

  • 天哪,你说得对。感谢您的帮助!希望错误有所改善:)
  • 我发现调试视图主体错误的最佳方法,特别是当它们没有意义时,就是开始注释掉。他们要么走开告诉你问题出在哪里,要么变成真正有意义的东西。
  • 该注释是真正的 MVP,将 else 注释掉引导我找到问题所在。编译器警告很糟糕!