子类化NSManagedObject的子类

时间:2015-07-21 12:46:27

标签: macos cocoa core-data

我尝试保持我的NSManagedObject-Subclasses在生成时整洁干净,但我想添加某些功能。

我的第一个想法是继承子类。

例如,我的帐户已生成,如下所示:

import Foundation
import CoreData

class Account: NSManagedObject {
    @NSManaged var displayName: String
    @NSManaged var host: String
    @NSManaged var port: NSNumber
    @NSManaged var schema: String
    @NSManaged var username: String
}

比我将其子类化并添加一个类func来初始化一个新的。

import Foundation
import CoreData

class AccountModel: Account {

    static var entityName = "Account"

    class func createAccount(context: NSManagedObjectContext) -> AccountModel {
        let entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: context)
        let account = AccountModel(entity: entity!, insertIntoManagedObjectContext: context)
        return account
    }
}

我的Unittest适用于这部分:

func testCreateAccount(){
    let account = AccountModel.createAccount(managedObjectContext!)
    dump(account)

    let accounts = AccountModel.getList(managedObjectContext!)
    XCTAssertEqual(accounts.count, 1, "There is no account created, yet")
}

但是如果向AccountModel添加新函数或计算属性,我会收到BAD_ACCESS错误。

class AccountModel: Account {
    [...]
    func foo(){
        println("bar")
    }
}

在我的测试中:

let account = AccountModel.createAccount(managedObjectContext!)
account.setValue("localhost", forKey: "host")
account.setValue(8080, forKey: "port")
account.setValue("https", forKey: "schema")    
account.foo()

帐户选择从Account开始,而不是从AccountModel开始。

您能帮我解决从模型类中分离生成的Class的问题吗?

非常感谢。 PS。

1 个答案:

答案 0 :(得分:1)

这可能是Swift编译器的bug。似乎没有正确创建子类的实例。我想也许动态调度的分析是不完整的,然后编译器无法正确初始化子类。 要防止出现此问题,请为子类声明指定final。它强制编译器调用子类的初始值设定项。

final class AccountModel: Account { // add final keyword!
    [...]
    func foo(){
        println("bar")
    }
}