You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI集成Firebase遭遇多编译错误,请求技术支持

错误修复方案及完整代码

错误逐个修复说明

  1. 未知属性'DocumentID'
    @DocumentID属性包装器来自FirebaseFirestoreSwift框架,确保导入该框架(可与Combine框架同时导入)。

  2. 结构体不符合Codable/Equatable/Hashable

    • 修正id的定义:将错误的赋值式写法改为计算属性,避免初始化阶段依赖self。
    • 处理user属性:如果使用自定义User结构体,需让其遵循Codable和Hashable;如果使用Firebase官方Auth.User,需通过CodingKeys排除该属性(因为Auth.User不支持Codable)。
  3. 无法在属性初始化器中使用实例成员'messageId'
    将id改为计算属性,不在初始化阶段直接访问messageId。

  4. 'nil'需要上下文类型

    • 修正Message初始化参数名:told改为toId。
    • 补充必填的timeStamp参数,用Timestamp(date: Date())生成合法时间戳。

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:55:55