![](/img/trans.png)
[英]How can I solve “The compiler is unable to type-check …” error in SwiftUI?
[英]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 - 带有日志详细信息(日期、时间和消息):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.