繁体   English   中英

当我遍历列表中的数组时,出现“编译器无法进行类型检查”错误?

[英]When I loop through an array in a list, I get "compiler is unable to type-check" error?

我正在制作这个应用程序,并且我有一个日志页面,您可以在其中查看您之前登录的时间。 我遍历了我的日志数组,但是当我尝试在循环中显示数组中的值时,我得到“编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式”错误。 这是 logView swift 文件的代码,还有更多文件,如果您需要,我可以给您,谢谢。

import SwiftUI

struct LogView: View {
 
 @AppStorage("log") private var log: [String] = []
 
 var body: some View {
     List{
         ForEach(0...log.count, id: \.self) { index in
             if(index % 2 == 0 && index != 0){
                 NavigationLink{
                    Text("log detail view")
                 }label: {
                     HStack{
                         Text(index)
                         Spacer()
                         Text(index+1)
                     }
                 }
             }
         }
     }
     .navigationTitle("Log")
     .listStyle(GroupedListStyle())
 }
}

struct LogView_Previews: PreviewProvider {
 static var previews: some View {
     RatingView(rating: .constant(3))
 }
}

非常感谢任何和所有提示,谢谢!

从您最后的评论中,我了解到您需要以下内容。 有一个结构LogItem ,它使用 id、创建日期/时间的时间戳和一条消息进行初始化。 它还包含 2 个函数,分别以格式化字符串的形式提供日期和时间。 Id、date 和 message 现在是 var 以匹配 Codable 协议。

LogView中,有一个嵌套在 NavigationView 中的列表,因此您可以使用 NavigationLinks 到详细信息页面(为此有一个新视图LogDetailedView

To add items to the array it is similar to the string array you used before, array has the function append, but instead of appending a string, you have to append an object of type LogItem. 为了展示它是如何工作的,我还添加了一个按钮,该按钮创建一个带有消息"Log Message"的新 LogItem 实例,这只是一个示例,您必须根据需要对其进行调整。

//
//  Log.swift
//  Log
//
//  Created by Sebastian on 23.08.22.
//

import SwiftUI

struct LogItem: Identifiable, Hashable, Codable {
    var id = UUID().uuidString
    var date = Date()
    var message: String
    
    func getDate() -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "dd/MM/yyyy"
        return dateFormatter.string(from: date)
    }
    
    func getTime() -> String {
        let calendar = Calendar.current
        let hour = calendar.component(.hour, from: date)
        let minutes = calendar.component(.minute, from: date)
        let seconds = calendar.component(.second, from: date)
        return ("\(hour):\(minutes):\(seconds)")
    }
}

struct ContentView: View {
    var body: some View {
        LogView()
    }
}

struct LogView: View {
    
    // Example text for new log events
    let exampleLogMessage = "Log Message"
    
    @AppStorage("logs") var logs: [LogItem] = []
    
    func addLogItem(message: String) {
        logs.append(LogItem(message: message))
    }
    
    var body: some View {
        NavigationView() {
            VStack(){
                List() {
                    ForEach(self.logs, id: \.self){ item in
                        NavigationLink(destination: LogDetailedView(logItem: item)) {
                            HStack() {
                                Text("\(item.getDate())")
                                Spacer()
                                Text("\(item.getTime())")
                            }
                        }
                    }
                }
                // This button is just an example how to add items to the array, please see also the function that gets called addLogItem(message: String)
                Button(action: {
                    self.addLogItem(message: exampleLogMessage)
                }) {
                    Text("Log Event")
                }
            }
        }
    }
}

struct LogDetailedView: View {
    
    var logItem: LogItem
    
    var body: some View {
        VStack() {
            Text("Date: \(logItem.getDate())")
            Text("Time: \(logItem.getTime())")
            Text("Message: \(logItem.message)")
        }
    }
}

要将@AppStorage与自定义 object数组一起使用,必须符合 RawRepresentable,您可以使用以下代码/扩展来实现这一点(只需在项目的某处添加一次):

extension Array: RawRepresentable where Element: Codable {
    public init?(rawValue: String) {
        guard let data = rawValue.data(using: .utf8),
              let result = try? JSONDecoder().decode([Element].self, from: data)
        else {
            return nil
        }
        self = result
    }

    public var rawValue: String {
        guard let data = try? JSONEncoder().encode(self),
              let result = String(data: data, encoding: .utf8)
        else {
            return "[]"
        }
        return result
    }
}

这里有 2 个屏幕截图(1. LogView - 带有可用日志列表;2. LogDetailedView - 带有日志详细信息(日期、时间和消息):

1. LogView - 带有可用日志列表

2. LogDetailedView - 带有日志详细信息(日期、时间和消息)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM