无法为图像阵列的表达式生成诊断

Posted

技术标签:

【中文标题】无法为图像阵列的表达式生成诊断【英文标题】: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,如果它作为初始化的一部分被传入,则不会。 【参考方案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:参数

以上是关于无法为图像阵列的表达式生成诊断的主要内容,如果未能解决你的问题,请参考以下文章

阵列生成图像

使用诊断工具观察 Microsoft.Extensions.DependencyInjection 2.x 版本的内存占用

图像高度和宽度的“语法错误,无法识别的表达式”

阵列衰减和修改

Thymeleaf:无法解析为表达式

编译器无法在 SwiftUI 中的合理时间内对该表达式进行类型检查?