1

使用 coredate 我使用了选项 codegen: category/extension 来创建一个文件,我可以在其中放入可重用的代码以查找、更新或删除数据库条目。我首先使用 codegen 选项 Class Definition 启动 coredata 实体,并在稍后阶段将其更改为类别/扩展。

现在我遇到了一个编译错误:“属性不能被声明为公共的,因为它的类型使用了内部类型”

文件名是生成的 swift 文件,名为:Gameresults+Coredataproperties.swift

我在播放器上收到错误:TournamentPlayer?

player 和 round 都是与另一个实体的关系。

import Foundation
import CoreData

extension GameResults {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<GameResults> {
        return NSFetchRequest<GameResults>(entityName: "GameResults")
    }

    @NSManaged public var earnedRankingPoints: Int16
    @NSManaged public var framePoints: Int16
    @NSManaged public var highestBreak: Int16
    @NSManaged public var isWon: Bool
    @NSManaged public var player: TournamentPlayer?
    @NSManaged public var round: Rounds?

}

我无法相信错误确实来自 swift,所以我尝试了干净的构建文件夹选项、保存文件、退出 XCode 等。没有任何效果。

在哪里查看如何解决此问题的任何提示?

4

1 回答 1

0

使用Manual/Nonecodegen 的选项。

您应该在这里考虑几件事。

  1. 当您使用 codegen 时,它会自动创建与您的实体等效的所有类作为公共。我假设 TournamentPlayer 类不是公开的,你自己定义了它。所以基于默认定义它是内部的,编译器会正确地给你错误。您在这里唯一能做的就是更改访问级别,因为您正在使用代码生成器,这意味着您想要更改您的模型,所以最好将您的 TournamentPlayer 更改为 public。尽管这取决于您的应用程序的体系结构。

  2. 每当您更改模型时,代码生成都会自动重新生成并保存在 DerivedData 中。

  3. 如果您想自己处理它,请将其设置为手动并自己手动处理代码生成。

查看这篇文章,它可以让您更好地了解 codegen https://useyourloaf.com/blog/core-data-code-generation/

还有一件事,当您更改为时,manual/none您必须进行干净的构建,否则它仍然使用 DerivedData 中生成的代码

于 2018-02-17T10:05:52.263 回答