タイトルそのままですが、
swiftでCoreDataのNSManagedObjectの Subclassを作るとき、 @objc(EntityClass)
と付けるやり方がありますが、それよりはCoreDataのEntity定義で
(モジュール名).(EntityClass名)
とする方が良さそうです。
@objc(Entity) を付ける場合
@objc(Entity)
を付けるとおそらく名前空間がGlobalな(従来のObjectiveCが使っている)場所になるのだと思います。
つまり、
@objc(ChildEntity)
class ChildEntity: NSManagedObject {
@NSManaged var identity: String
@NSManaged var name: String?
@NSManaged var birthday: NSDate?
@NSManaged var sex: NSNumber?
@NSManaged var imageFilename: String?
}
と書くと ChildEntity
というClassが定義されるので、CoreDataの設定もChildEntity
と書いておけば良いことになる(のだと思います)。
しかしこれだと、従来のObjectiveCコードでたまたま ChildEntity というClass(というかinterface)が定義されているとおそらくビルドできなくなりそうです(だから今までは3文字Prefixを付けていたわけですが)。
@objc を付けない場合
@objc()
を付けない場合、CoreDataのModel定義で、モジュール名のPrefixを付けます。以下のような感じになります。
class ChildEntity: NSManagedObject {
@NSManaged var identity: String
@NSManaged var name: String?
@NSManaged var birthday: NSDate?
@NSManaged var sex: NSNumber?
@NSManaged var imageFilename: String?
}
普通のSwiftのClassは モジュール名.Class名
という名前を持つので、他のコードやライブラリと衝突することはまずありません(モジュール名が同じでない限り…)。
モジュール名は普通は Projectの Target名 になります。
どっちが良いか?
結論としては @objc()を付けない 方が良いと思っています。
- 多少モジュール名のPrefixをModel定義に書くのが面倒ですが、まあそれほどでもない
- 名前の衝突リスクを回避できるのは大きい
- @objcを付ける方法だと上手くいかない 時があった が、付けない方法にしたら解消した(これは一時的な問題かもしれないですが)。