LoginSignup
35
31

More than 5 years have passed since last update.

SwiftでNSManagedObjectのSubclassを使う場合は、対応Class名にモジュール名のPrefixを付ける

Last updated at Posted at 2014-08-02

タイトルそのままですが、
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を付けます。以下のような感じになります。

PetampCoreDataModel_xcdatamodel_—_Edited.png

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を付ける方法だと上手くいかない 時があった が、付けない方法にしたら解消した(これは一時的な問題かもしれないですが)。
35
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
31