2015-07-21 101 views
1

我儘量保持我的NSManagedObject-子類整齊和乾淨,因爲他們生成,但我想添加某些functionallity。子類的NSManagedObject的子類

我的第一個想法是子類的子類。

例如,產生我的帳戶,看起來像這樣:

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 
    } 
} 

我的單元測試工作正常,這部分:

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() 

帳戶接縫是一個實例,從帳戶,而不是從AccountModel。

你能幫我解決這個從模型類中分離生成的類的問題嗎?

非常感謝。 ps。

回答

1

這可能是Swift編譯器的bug。它似乎不能正確創建子類的一個實例。我認爲動態分派的分析可能不完整,那麼編譯器無法正確初始化子類。 爲了防止出現這個問題,可以爲子類聲明指定final。它強制編譯器調用子類的初始化器。

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