web-dev-qa-db-ja.com

Swift Core Dataエンティティからのモデルの生成

Xcode 8の更新:

Xcode 8では、Core Data Model Editorに移動して、ファイルインスペクターを表示する必要があります。下部近くには、コード生成のオプションがあります。 Swiftを選択します。

編集:Core DataエンティティからSwiftモデルを生成するソリューションが見つかりました:

Xcodeの場合:

エディター> NSManagedOjbectの作成>「次へ」ボタンをクリック>「次へ」ボタンをクリック>「Swift」言語の選択>「作成」ボタンをクリック


私はSwift Coreageを使用してXcode 6ベータで新しいSwiftプロジェクトを作成することで言語を試してみました。

Core Dataのエンティティからモデルを生成すると、XcodeはObjective-Cモデルを作成します。

Core Dataを使用したObejctive-CモデルではなくSwiftモデルを生成する方法はありますか?

ありがとう!

50
Jean Lebrument

Objective-Cの方法を見てみましょう。

Person.h(ヘッダーファイル)

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Person : NSManagedObject
@property (nonatomic, retain) NSString *name;
@end

Person.m(実装ファイル)

#import "Person.h"

@implementation Person
@dynamic name;
@end

Swift

Xcode6-Betaに既に含まれているドキュメントには次のように書かれています。

Core Dataは、NSManagedObjectクラスのサブクラスのプロパティの基礎となるストレージと実装を提供します。 Core Dataモデルの属性または関係に対応する管理対象オブジェクトサブクラスの各プロパティ定義の前に@NSManaged属性を追加します。 Objective-Cの@dynamic属性と同様に、@ NSManaged属性はSwiftコンパイラーに、実行時にプロパティの格納と実装が提供されることを通知します。ただし、@ dynamicとは異なり、@ NSManaged属性はコアデータサポートでのみ使用可能です。

それで、上記の例をSwift(テストなし)に書き換えます。

Person.Swift

import CoreData

class Person: NSManagedObject {

    @NSManaged var name : NSString

}

そして、あなたの質問によると、サブクラス生成機能はまだXcode6に含まれていないかもしれないと思います。 XcodeでCocoa-Projectを作成するときに、プログラミング言語として「Swift」を選択したことを確認しましたか?

30
wottpal

_NSEntityDescription.insertNewObjectForEntityForName_を使用してSwiftモデルを戻すことができますが、コアデータモデルファイルを編集し、Personをクラスエンティティとして使用せず、_<ProjectName>.Person_ elseを使用する必要がありますNSManagedObject...を返します.

println()を使用すると、Personインスタンスは表示されませんが、_<_TtC5ProjectName4Person: 0xc9ad5f0>_のようなものですが、これでメソッドを呼び出すと、Personインスタンスであることがわかります。 Swiftが競合ではなく一意のクラス名を生成するための方法であり、CoreDataメソッドがこの内部メカニズムを示していると思います。

Appleのドキュメントによると

Swiftクラスは名前空間であり、それらはコンパイルされるモジュール(通常はプロジェクト)にスコープされます。NSManagedObjectクラスのSwiftサブクラスをコアデータモデルで使用するには、クラスのプレフィックスを付けますモデルエンティティインスペクターの[クラス]フィールドにモジュールの名前を入力します。

12
Fabien Penso

CoreDataフレームの新機能に関するAppleのビデオ:38分(WWDC2014セッション225)、検査官のデータモデルで、クラス名の前にプロジェクト名を付けます。 projectName.Doctorのように

私はこれを試しましたが、生成される管理対象オブジェクトクラスは、Doctor.SwiftではなくprojectName.Swiftになります。クラス宣言でさえclass projectName:ManagedObjectになります

解決策:

データモデルインスペクターで、オブジェクトの名前とクラスを任意の名前に指定するだけです例:Doctor

オブジェクトモデルを生成してSwiftを選択すると、ファイルが作成されます(Doctor.Swift)。

現在、コアデータに新しいレコードを挿入すると、エラーが発生する場合があります「クラスが見つかりません。代わりにデフォルトのNSManagedObjectを使用します」オブジェクトを正しいオブジェクト名に。

これを解決するには、クラス宣言の上に@ objc(class name)を追加するだけです。以下のサンプルを参照してください。

import Foundation
import CoreData

@objc(Doctor)
class Doctor: NSManagedObject {
    @NSManaged var name: String
}

次に:

let doctorManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Doctor", inManagedObjectContext: context) as Doctor
doctorManagedObject.name = "John" // you can now use dot syntax instead of setValue

コンテキストを保存して挿入をコミットします。

11
Zaldy

または、#import "Person.h"をXcodeが生成するブリッジングヘッダーProject-Bridging-Header.hに追加することもできます(生成の提案を受け入れた場合)。その後、自動生成されたすべてのObj-CをネイティブSwiftのように使用できます。

3
JefferyRPrice

@NSManagedをテストしましたが、機能しませんでした。 :(。ただし、xcdatamodelによって生成された混合モデルファイル(.h)は成功します。ドキュメントとコードを読んでください https://github.com/iascchen/SwiftCoreDataSimpleDemo

3
IascCHEN

エディター-> NSManagedObjectサブクラスの作成 Swiftで正常に動作します

通常の手順をすべて実行しますが、ファイルを作成するときに、初めて使用する場合は言語「Swift」を選択しますCreate NSManagedObject Subclass with SwiftプロジェクトはデフォルトでObjective Cになります

2
Magoo