Xcode Trace/BPT 陷阱:5

Xcode Trace/BPT trap: 5

情况

你好, 我正在开发一个 iOS 应用程序,在构建我的项目时,我 运行 出现以下错误消息: 错误:Trace/BPT 陷阱:5

我没有在网上找到任何解决此问题的方法,所以我想知道这里是否有人可以提供帮助。 我也遇到了 Cocoapods 和我的 Silicon Mac 的问题,所以我想列出我尝试修复的步骤:

设置

我尝试修复的步骤

然后出现如下错误:

日志

来自 Merge swiftmodule 的日志实体 (x86_64): https://pastebin.com/MiSKGxB7 (日志太长,超过字符限制)。

代码

正如某处的错误所说,它是在尝试序列化 class BaseViewModel 时发生的,这是我编写的包含 class 的 Base.swift 文件中的代码:

import SwiftUI
import Firebase
import FirebaseFirestore
import Combine

protocol BaseModel: Identifiable, Codable {
    var id: String? { get set }
    var collection: String { get }
    init()
}

class BaseViewModel<T: BaseModel>: ObservableObject, Identifiable, Equatable {

    @Published var model: T
    var id: String {
        didSet {
            self.model.id = id
        }
    }
    
    var cancellables = [AnyCancellable]()
    private var db = Firestore.firestore()
    
    required init(){
        let model = T.init()
        self.model = model
        self.id = model.id ?? UUID().uuidString
    }
    
    required init(id: String) {
        var model = T.init()
        model.id = id
        self.model = model
        self.id = id
    }
    
    init(model: T) {
        self.model = model
        self.id = model.id ?? UUID().uuidString
    }

    static func ==(lhs: BaseViewModel<T>, rhs: BaseViewModel<T>) -> Bool {
        lhs.model.id == rhs.model.id
    }
    
    func load(completion: @escaping (Bool) -> Void = {finished in}){
        if let id = model.id {
            self.id = id
            db.collection(model.collection).document(id).getDocument { docSnapshot, error in
                guard let doc = docSnapshot else {
                    print("Error fetching document: \(error!)")
                    return
                }
                
                do {
                    guard let data = try doc.data(as: T.self) else {
                        print("Document empty \(type(of: self.model)) with id \(id)")
                        return
                    }
                    self.model = data
                    self.loadSubData {finished in
                        if finished{
                            completion(true)
                        }
                    }
                } catch {
                    print(error.localizedDescription)
                }
            }
        }
    }
    
    func loadSubData(completion: @escaping(Bool) -> Void = {finished in}) {
        fatalError("Must be overridden!")
    }
    
    func loadDataByIDs<T, S>(from list: [String], appender: @escaping (T) -> Void) where T: BaseViewModel<S>, S: BaseModel {
        for id in list {
            let viewModel = T.init(id: id)
            viewModel.load{finished in
                if finished {
                    appender(viewModel)
                }
            }
        }
    }
    
    func save(){
        do {
            let _ = try db.collection(model.collection).addDocument(from: model)
        } catch {
            print(error)
        }
    }
    
    func update(){
        if let id = model.id {
            do {
                try db.collection(model.collection).document(id).setData(from: model)
            } catch {
                print(error.localizedDescription)
            }
        }
    }
    
    func delete(){
        if let id = model.id {
            db.collection(model.collection).document(id).delete() { error in
                if let error = error {
                    print(error.localizedDescription)
                }
            }
        }
    }
    
}

我遇到了同样的问题,我更新后解决了Quick/Nimble。 我想一些带有 x86 文件的 pod 项目需要更新以支持 M1

郑重声明,任何在 M1 上遇到这些奇怪错误的人都必须准确阅读 excode 编译错误。

如果他们说的是特定的 class,则意味着 xcode 无法编译您的代码,您应该删除代码并尝试逐行编译。 我知道这很奇怪,看起来像是编程 PHP 和刷新网页,但我确信此类错误可能与平台迁移有关。

在我的情况下,我有一个 class 没问题,我开始重构,而不是 xcode 向我显示编译错误,它给出了这个神秘的 BPT5,在阅读里面的描述时在 IDE 中,我发现我的 class 是根本原因。

只需删除所有更改过的代码,然后尝试重新编译...

抱歉更新晚了。但就我而言,一般是 CocoaPods 或当时与 Apple Silicon 不兼容的 Firebase Pods。
我只是在使用 Swift 包管理器,并且它起作用了。
不过我不知道问题是否仍然存在,因为我没有在 M1 MacBook 上构建另一个应用程序。