Xcode 跟踪/BPT 陷阱:5

时间:2021-01-30 13:53:05

标签: swift xcode swiftui cocoapods apple-silicon

情况

你好, 我正在开发一个 iOS 应用程序,在构建我的项目时,我遇到了以下错误消息: 错误:跟踪/BPT 陷阱:5

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

设置

  • M1 MacBook Pro,macOS 11.1
  • XCode 12.4 版
  • 带有用于 Firebase Swift、Auth、Firestore 和 Storage 的 Pods 的 Cocoapods

我尝试修复的步骤

  • cmd + shift + k 用于清理构建文件夹
  • 使用 Rosetta 关闭 XCode 并打开终端
  • 删除 ~/Library/Developer/Xcode/Derived Data - 文件夹
  • pod 在项目目录中解体
  • 删除Podfile.lock、app.xcworkspace、Pods目录
  • pod 安装
  • 在 app 和 pods 项目构建设置中,将任何 iOS 模拟器 SDK 的排除架构设置为 arm64
  • 将仅构建活动架构设置为是
  • 将 Pods 项目转换为 Swift 5
  • 构建 Pod 项目
  • 构建应用项目

然后出现如下错误:

日志

来自 Merge swiftmodule (x86_64) 的日志条目: https://pastebin.com/MiSKGxB7 (日志方式要长,超过字符限制)。

代码

正如某处的错误所说,它是在尝试序列化 BaseViewModel 类时发生的,这是我编写的包含该类的 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)
                }
            }
        }
    }
    
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

作为记录,任何在 M1 上遇到这些奇怪错误的人都必须准确阅读 excode 编译错误。

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

在我的情况下,我有一个很好的类,我开始重构,而不是 xcode 向我显示编译错误,它给出了这个神秘的 BPT5,在准确阅读 IDE 内部的描述时,我可以发现我的类是根本原因。

只需删除所有更改的代码,然后再次尝试编译...