SwiftUI集成Firebase遭遇多编译错误,请求技术支持
错误修复方案及完整代码
错误逐个修复说明
未知属性'DocumentID'
@DocumentID属性包装器来自FirebaseFirestoreSwift框架,确保导入该框架(可与Combine框架同时导入)。结构体不符合Codable/Equatable/Hashable
- 修正
id的定义:将错误的赋值式写法改为计算属性,避免初始化阶段依赖self。 - 处理
user属性:如果使用自定义User结构体,需让其遵循Codable和Hashable;如果使用Firebase官方Auth.User,需通过CodingKeys排除该属性(因为Auth.User不支持Codable)。
- 修正
无法在属性初始化器中使用实例成员'messageId'
将id改为计算属性,不在初始化阶段直接访问messageId。'nil'需要上下文类型
- 修正Message初始化参数名:
told改为toId。 - 补充必填的
timeStamp参数,用Timestamp(date: Date())生成合法时间戳。
- 修正Message初始化参数名:
修正后的完整代码
import Foundation import Firebase import FirebaseFirestoreSwift import FirebaseFirestoreCombineSwift import FirebaseAuth // 自定义User结构体(若使用Firebase Auth.User,需用CodingKeys排除该属性) struct User: Identifiable, Codable, Hashable { var id: String // 可添加name、email等自定义属性 } struct Message: Identifiable, Hashable, Codable { @DocumentID var messageId: String? let fromId: String let toId: String let messageText: String let timeStamp: Timestamp let isImage: Bool let isAudio: Bool let isVideo: Bool let user: User? // 修正为计算属性 var id: String { messageId ?? UUID().uuidString } var chatPartnerId: String { fromId == Auth.auth().currentUser?.uid ? toId : fromId } var isFromCurrentUser: Bool { fromId == Auth.auth().currentUser?.uid } // 若使用Firebase Auth.User,取消以下注释排除user属性 // enum CodingKeys: String, CodingKey { // case messageId, fromId, toId, messageText, timeStamp, isImage, isAudio, isVideo // } } struct MessageGroup: Identifiable, Hashable { var id: String = UUID().uuidString var messages: [Message] let date: Date } extension MessageGroup { static let MOCK_MESSAGE_GROUP = [MessageGroup( messages: [ Message( fromId: "", toId: "", messageText: "Wsp dude", timeStamp: Timestamp(date: Date()), isImage: false, isAudio: false, isVideo: false, user: nil ), Message( fromId: "", toId: "", messageText: "Wsp dude", timeStamp: Timestamp(date: Date()), isImage: false, isAudio: false, isVideo: false, user: nil ), Message( fromId: "", toId: "", messageText: "Wsp dude", timeStamp: Timestamp(date: Date()), isImage: false, isAudio: false, isVideo: false, user: nil ), Message( fromId: "", toId: "", messageText: "Wsp dude", timeStamp: Timestamp(date: Date()), isImage: false, isAudio: false, isVideo: false, user: nil ), Message( fromId: "", toId: "", messageText: "Wsp dude", timeStamp: Timestamp(date: Date()), isImage: false, isAudio: false, isVideo: false, user: nil ) ], date: Date() )] }
内容的提问来源于stack exchange,提问作者Tyleraaron
相关产品推荐
相关产品推荐

