web-dev-qa-db-ja.com

Xcode-beta 8.コアデータを作成できない

コアデータを追加しようとしています。そして、同じエラーが発生するたびに:

error: filename "EntityName +CoreDataClass.Swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.Swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.Swift'

次の手順を使用してコアデータを追加します。
1。新しいファイル/ DataModel;私のプロジェクトのルートディレクトリに保存します
Model.xcdatamodeldを選択してエンティティを追加し、いくつかの属性を追加し、NSManagedObjectClassサブクラスを保存、編集/作成します。

その結果、ナビゲーターに4つの新しいファイルがあります:Model.xcdatamodeld、EntityName + CoreDataProperties.Swift、EntityName + CoreDataClass.Swift、_ COREDATA_DATAMODELNAME _ + CoreDataModel.Swift

その内容:_ COREDATA_DATAMODELNAME _ + CoreDataModel.Swift:

import Foundation
import CoreData

___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___

EntityName + CoreDataClass.Swift:

import Foundation
import CoreData


class EntityName: NSManagedObject {

}

EntityName + CoreDataProperties.Swift:

import Foundation
import CoreData

extension EntityName {

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

    @NSManaged var str: String?

}

私が試したもの:
1。ビルドのクリーンアップ、DerivedDataの削除、var/foldersのコンテンツの削除、再起動
2。ナビゲーターに表示された生成されたファイルを削除する

私の努力はすべて運が悪かった。
私が間違っていることは何ですか?

39
spin_eight

Xcode 8には、モデルファイルがXcode 8ファイル形式を使用する場合のNSManagedObjectクラスの自動生成が含まれます。独自のサブクラスファイルを作成すると、複製が作成されます。エラーメッセージのDerivedSourcesにある2番目のファイルは、Xcodeが自動的に作成したファイルです。

自動的に生成されたファイルが必要な処理を行う場合は、独自のファイルの作成を停止するだけでかまいません。

代わりに独自のサブクラスを作成する場合は、次のいずれかを実行できます

  • モデルファイルの「ツールバージョン」をXcode 7.3以前に設定して、すべてのコード生成を無効にします(これにより、実際のファイルの内容について意味のある変更は行われないようです)。
  • エンティティの「Codegen」設定を「Manual/None」に設定して、各エンティティの自動生成を個別に無効にします。
45
Tom Harrington

XCode 8には2つのバグがあります:

1-Codegenドロップダウンを変更した場合、新しい値はModel.xcdatamodelに保存されません。保存するには、他の何かを変更する必要があります。たとえば、クラス名を変更します。ビルド;クラス名を元に戻します。再度ビルドします。

2-生成されたコードはIntermediatesフォルダーのDerivedDataに配置されますが、フォルダーがまだ存在しない場合にのみ発生します。回避策は、クリーンにしてからビルドすることです。

52
DavidA

私は実際に同じ問題を抱えており(Swiftを使用)、それがバグであると疑っています。私が正しく理解している場合、OPはXcodeのautogen NSManagedObjectサブクラスを使用しており、その後、混乱の原因と思われる追加の(不要な)サブクラスを作成しません。

再現する手順:

  1. 新しいプロジェクト、シングルビューアプリケーションを作成します。 「コアデータを使用」にチェックマークを付けます

  2. モデルエンティティにエンティティを作成し、プロパティを追加し、ファイルが保存されていることを確認します(明示的に保存されていない場合、Xcode 8 Betaはデータをスローする場合があります)

  3. Editor-> Created NSManagedObjectサブクラスを選択します。関連するボックスにチェックマークを付けます

Xcodeは3つのファイルを作成します。

  1. COREDATA_DATAMODELNAME _+ CoreDataModel.Swift。このファイルは破損しており、FoundationおよびCoreDataをインポートするステートメントに続く無効なエントリが含まれています-このファイルを削除しないとプロジェクトはコンパイルされません

    import Foundation
    
    import CoreData
    
    ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
    
  2. EntityName + CoreDataClass.Swift

  3. EntityName + CoreDataProperties.Swift

エディターはこの時点でエラーにフラグを立てませんが、OPにリストされた理由でコンパイルに失敗します(つまり、DerivedDataフォルダーに同じ名前で '。'プレフィックスが付いたファイルが見つかりません)

Xcodeの明らかにバグのある自動生成を使用せずにモデルを作成した後、NSManagedObjectサブクラスを手動で作成する場合、問題はありません。もう少しタイピングしますが、ずっと信頼できます!ただし、「クリーンな」プロジェクトから開始する必要があります(つまり、サブクラスを自動生成しようとする前)。そうしないと、エラーが続きます。派生データを削除しても、残念なことにはなりません。

*****更新*****かなり奇妙なことが起こっているように見え、元々提案されていたようにサイレントコード生成が行われているように見えます(謝罪)が、これは予想とは非常に異なる動作です。さらに、このコードはエディターでは表示されません(これは少し無意味で混乱しやすいようです)。 DerivedData> Build> Intermediates> .Buildのサブフォルダーに作成されます。

OPが混乱した理由を完全に見ることができます(私がそうだったように!)この「機能」の価値があるのは間違いなく役立つことですが、以前の動作に慣れていて生成するオプションが提供されている場合はやや混乱していますメインメニューから表示可能で編集可能な複製。

そのため、Codegenウィンドウ(以下に示す)で[Manual/None]を選択すると、メニューバーでauto-genオプションを使用するか( 'junk'を削除した後)、独自のコードを記述できます。

New XCode 8 codegen option

12
rustproofFish

次の手順を実行します、

  1. エンティティの「Codegen」設定を「Manual/None」に設定して、各エンティティの自動生成を個別に無効にします。

  2. エンティティ名を別の名前に変更して保存します。たとえば、クラス名を変更します。ビルド;クラス名を元に戻します。再度ビルドします。

5
Baig

このエラーが出ました

ファイル.xcdatamodeldでツールバージョンをXcode 7.3に変更するだけです。

そしてそれはうまくいきます!

2

投稿されたいくつかの回答を試した後、マシンを再起動するとうまくいきました。

0
AlexMath

トム・ハリントン答えは正しいです。ただし、上記の2つのオプションを実行せずに、独自の関数や変数を追加する方法があります。

ただクラスの拡張を作成する。 (Swiftファイルには、自動生成された標準のNSManagesObjectファイルとは異なる名前を付けてください。)

例えば。 MyEntityというエンティティがある場合は、SwiftファイルMyEntityExtension.Swiftこれは次のようになります。

import Foundation
import CoreData
import UIKit


extension MyEntity {

    var color: UIColor {
        get {
            return self.colorValue as! UIColor
        }
        set {
            if newValue.isMember(of: UIColor.self) {
                self.colorValue = newValue
            }
        }
    }

}
0
guido

Autogenの動作に問題があるすべての人のために:

エンティティのユーザー情報設定で「com.Apple.syncservices.Syncable」を「NO」に設定する必要がありました。

たぶんそれが役立ちます。

0
Rion

[ビルドフェーズ]タブの[ソースのコンパイル]タブでコンパイルファイルのコアデータを削除します-

0
Sasha Tsvigun