【问题标题】:Failed to produce diagnostic for expression for image array无法为图像阵列的表达式生成诊断
【发布时间】:2021-07-18 13:46:40
【问题描述】:

我正在尝试将 SWiftUI 类中的 UIImage 数组用于 forEach 循环,但 Xcode 总是给我错误“无法为表达式生成诊断;”。我也尝试使用 Data 数组但同样的错误。下面是我的代码。如果有人能指出我做错了什么,那就太好了?

struct Sample: View {

    let imageArray: [UIImage]

    var body: some View {
        ForEach(imageArray) { image in
            Image(uiImage: image)
        }
    }
}

【问题讨论】:

  • 你必须初始化你的数组,例如 "var imageArray: [UIImage] = []" 为一个空数组。如果你想要一些 UIImage 在里面,你需要把它们放进去。
  • @workingdog,如果它作为初始化的一部分被传入,则不会。

标签: ios swift xcode swiftui


【解决方案1】:

这对我有用:

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
struct Sample: View {
    let imageArray: [UIImage]
    
    var body: some View {
        ForEach(imageArray, id: \.self) { image in
            Image(uiImage: image)
        }
    }
}

struct ContentView: View {
    @State var imageArray: [UIImage] = []
    
    var body: some View {
        Sample(imageArray: imageArray)
            .onAppear {
                if let img = UIImage(systemName: "globe") {
                    imageArray.append(img)
                }
            }
    }
}

【讨论】:

    【解决方案2】:

    ForEach 运算符要求数组元素符合可识别的。对于像 UIImage 这样的东西,你可以传递 self。

    var body: some View {
        ForEach(imageArray, id: \.self) { image in
            Image(uiImage: image)
        }
    }
    

    就个人而言,我也会将它包装在一个堆栈中,只是为了明确

    var body: some View {
        VStack {
            ForEach(imageArray, id: \.self) { image in
                Image(uiImage: image)
            }
        }
    }
    

    【讨论】:

    • 您忘记了 ForEach 中的“id: \.self”。
    • @workingdog 谢谢,翻译迷路了。
    【解决方案3】:

    试试这个:

    import SwiftUI
    
    struct imageId: Identifiable {
    var id = UUID()
    var image: UIImage
    
    }
    
    
    struct Sample: View {
    
    let imageArray: [imageId] = []
    
    var body: some View {
        ForEach(imageArray, id: \.id) { image in
            Image(uiImage: image.image)
        }
    }
    }
    

    【讨论】:

      【解决方案4】:

      我能够通过在 ForEach 循环中添加 id 来解决问题。下面是我的代码现在的样子。

      struct ImageData: Identifiable {
          let id = UUID()
          let image: UIImage
      }
      
      struct Sample: View {
      
          let imageDataArray: [ImageData]
      
          var body: some View {
              ForEach(imageDataArray) { imageData in
                  Image(uiImage: imageData.image)
              }
          }
      }
      

      我从这里学到的是,对于 UIImage 等对象,如果需要枚举,必须在 ForEach 循环上添加 id 属性。为了解决这个问题,我创建了一个包含 id 和 image 属性的模型类并枚举了它。

      【讨论】:

      • 如果ImageDate是Identifiable,则不需要ForEach中的id:参数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2022-01-07
      • 2014-06-07
      • 2022-01-14
      相关资源
      最近更新 更多