代码之家  ›  专栏  ›  技术社区  ›  JavaJoe

仅针对iOS Swift核心数据实现发布版本重新声明init()无效

  •  2
  • JavaJoe  · 技术社区  · 8 年前

    我遇到了一个奇怪的情况,我不知道如何解决。

    我有一个iOS应用程序,我正在Swift中工作,它使用核心数据,我已经成功构建并作为调试版本运行了一段时间。我现在尝试构建版本以对发布版本进行评测,随后只是尝试在不进行评测的情况下进行发布版本,对于定义了设置核心数据存储组件的代码的存储实现部分的结构,发布版本失败并出现错误“init()的重新声明无效”。

    下面是在调试中编译并运行良好,但在发布版中无法生成的代码。。。

    struct MyStorage { //<-- Invalid redeclaration of init() build error in release build only
    
    static var shared = MyStorage()
    
    @available(iOS 10.0, *)
    private lazy var persistentContainer: NSPersistentContainer = {
    
        let container = NSPersistentContainer(name: "MyStorage")
        container.loadPersistentStores { (storeDescription, error) in
            print("CoreData: Inited \(storeDescription)")
            guard error == nil else {
                print("CoreData: trying to create persistentContainer named Model and got Unresolved error \(String(describing: error))")
                return
            }
    
        }
        return container
    }()
    
    private lazy var persistenStoreCoordinator: NSPersistentStoreCoordinator? = {
        do {
            return try NSPersistentStoreCoordinator.coordinator(name:"MyStorage")
        } catch {
            print ("CoreData: trying to create persistenStoreCoordinator named Model and got Unresolved error \(error)")
        }
    
        return nil
    }()
    
    private lazy var managedObjectContext: NSManagedObjectContext = {
        let coordinator = self.persistenStoreCoordinator
        var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator
    
        print ("CoreData: initing and returning managedObjectContext")
    
        return managedObjectContext
    }()
    
    enum SaveStatus {
        case saved, rolledBack, hasNoChanges
    }
    
    var context: NSManagedObjectContext {
        mutating get {
            if #available(iOS 10.0, *) {  
                return persistentContainer.viewContext
            } else {
                return managedObjectContext
            }
        }
    }
    
    mutating func save() -> SaveStatus {
        if context.hasChanges {
            do {
                try context.save()
                return .saved
            } catch {
                context.rollback()
                return .rolledBack
            }
        }
        return .hasNoChanges
    }
    

    我清理了构建(和option cleaned以清理构建文件夹),两者都没有用。有人能帮助解释为什么发布版本失败,而调试版本成功地使用相同的代码吗?

    提前感谢您的帮助或建议。

    :根据下面的建议,我将MyStorage结构更改为一个类并删除了mutating,现在代码可以在发布配置中生成,并且可以为发布的构建进行分析。

    0 回复  |  直到 8 年前