Xcode 6.1を使用して、既存のObjective-C TV Showアプリを新しいSwiftバージョンに複製していますが、CoreDataに問題があります。
4つのエンティティのモデルを作成し、NSManagedObjectサブクラス(Swiftで)を作成し、すべてのファイルに適切なアプリターゲットセットがあります(「ソースのコンパイル」)。
新しいエンティティを挿入しようとすると、このエラーが引き続き発生します。
CoreData:警告:エンティティ 'Shows'の 'Shows'という名前のクラスをロードできません。代わりにデフォルトのNSManagedObjectを使用して、クラスが見つかりません。
いくつかのコメント:
Core Dataに保存する場合、親子コンテキストを使用してバックグラウンドスレッドを許可します。これを行うには、次を使用してManagedObjectContextをセットアップします。
lazy var managedObjectContext: NSManagedObjectContext? = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
とを使用してデータを保存することにより:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
context.parentContext = self.managedObjectContext!
...rest of core data saving code here...
})
この警告は、Swift実装の詳細が解決されている間に対処しなければならない癖の1つです。警告は誤って発生します。つまり、以下で説明する手順に従わなくても、セットアップが機能する可能性があります。
ほとんどの場合、それを取り除くことができましたモデルエディターでクラスが正しく設定されていることを確認することで。他の多くのSOF投稿(この質問への回答を含む)とは異なり、モジュール名(MyApp.Shows
など)を含める提案にはnotが役立ちました。
次の3つの項目を必ず確認してください。
1。
Xcode 7ベータ3まで動作するバージョン
エンティティ名をより適切な単数形に修正したことに注意してください。
Xcode 7.1のSwift 2.0で機能するバージョン
(Xcode 7ベータ4以上で動作します)
モジュールの「現在の製品モジュール」というテキストを削除する必要があります!
2。
また、頻繁に推奨事項に従うことも含める必要があります
@objc(Show)
クラスのすぐ上です。
注:Xcode 7ベータ4以降を使用している場合、この手順はオプションです。
。
また、castが適切なクラスに作成された管理対象オブジェクトであることを確認してください。デフォルトはNSManagedObject
になります。
var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show",
inManagedObjectContext: context) as Show
Swift 2/XCODE 7アップデート:
この問題(この回答に関する4月3日のコメントも参照)はresolved inSwift 2およびAppleによるXCode 7ベータリリース。したがって、実際には、Mundiが回答したように、またはクラス名の前に「
MyAppName.
」を使用して、Swiftの@objc(myEntity)
は必要ありません。動作を停止します。したがって、これらを削除し、Class
の名前をFileに入れて、Current Working Module
をModuleとして選択し、歓声を上げてください。
しかし、Swift(私のように)で@objc(myEntity)
を使用している場合は、代わりにスムーズに機能するこの他のソリューションを使用できます。
Xcdatamodelの正しいクラスでは、次のようになります。
どうぞ。Module.Class
は、SwiftおよびXCode 6のCoreDataのパターンです。を使用する場合も同じ手順が必要です。カスタムポリシーモデルポリシーまたはその他のCoreDataのクラス。 注:画像では、名前とクラスはCarとMyAppName.Car(またはエンティティの名前)でなければなりません。ここで、User
はタイプミスです。
Xcode 7と純粋にSwiftを使用する場合、実際にはremove@objc(MyClass)
から自動生成NSManagedObject
サブクラス(生成元 Editor > Create NSManagedObject Subclass...)。
Xcode 7ベータ2(および私は1を信じる)では、モデル構成で、タイプFile
の新しい管理対象オブジェクトがモジュールCurrent Product Module
に設定され、オブジェクトのクラスが構成に.File
として表示されます。
空白になるようにモジュール設定を削除するか、構成内のクラス名がちょうどFile
になるようにフルストップを削除すると、それぞれが他の変更を引き起こすため、同等のアクションになります。この構成を保存すると、説明されているエラーが削除されます。
Xcode 6.1.1では、ベースエンティティがobjcクラス(NSManagedObject)のサブセットであるため、@ objc属性を追加する必要はありません( Swift Type Compatibility を参照してください。CoreDataでは完全なModule.Class名モジュール名は、[ビルド設定]-> [パッケージ]-> [製品モジュール名]で設定されているものであることに注意してください。デフォルトでは、これはTarget's名前。
XCode 7およびSwift 2.0バージョンでは、@ objc(NameOfClass)を追加する必要はなく、「データモデルインスペクターの表示」タブでエンティティ設定を変更するだけです。
名前-「あなたのエンティティ名」
クラス-「あなたのエンティティ名」
モジュール-「現在の製品モジュール」
エンティティクラスファイルのコードは次のようになります(私のコードでは、エンティティはファミリです)-
import UIKit
import CoreData
class Family: NSManagedObject {
@NSManaged var member : AnyObject
}
この例は、xCode 7.0 + Swift 2.0を使用して私のアプリで正常に動作しています
PRODUCT_MODULE_NAME
を製品モジュール名に置き換えることを忘れないでください。
新しいエンティティが作成されたら、データモデルインスペクター(最後のタブ)に移動し、PRODUCT_MODULE_NAME
をモジュール名に置き換える必要があります。そうしないと、永続ストアコーディネーターの作成時にclass not found
エラーが発生します。
また、キャストを実行するときは、(少なくともXcode 6.3.2では)Module.Classを使用する必要があります。たとえば、モジュール(製品名)がFoodで、クラスがFruitであると仮定します
let myEntity = NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext)
let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit
要約:
同様の問題も発生しました。次の手順に従って解決してください。
データモデルエディターでエンティティクラス名を問題のクラスに対応するように変更し、クラス宣言のすぐ上の各NSManagedObjectのファイルに@objc(NameOfClass)
を追加すると、ユニットテスト中にこの問題が解決しました。
私のために働いたのは(Xcode 7.4、Swift)、エンティティインスペクタの「クラス」ボックスでクラス名を<my actual class name>.<entity name>
に変更することです.
管理対象オブジェクトサブクラスの開始者は、次のようになります。
convenience init(<properties to init>) {
let entityDescr = NSEntityDescription.entityForName("<entity class name>", inManagedObjectContext: <managed context>)
self.init(entity: entityDescr!, insertIntoManagedObjectContext: <managed context>)}
//init properties here