我尝试保持我的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。
答案 0 :(得分:1)
这可能是Swift编译器的bug。似乎没有正确创建子类的实例。我想也许动态调度的分析是不完整的,然后编译器无法正确初始化子类。
要防止出现此问题,请为子类声明指定final
。它强制编译器调用子类的初始值设定项。
final class AccountModel: Account { // add final keyword!
[...]
func foo(){
println("bar")
}
}