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()
계정 이음새가 AccountModel이 아닌 Account의 인스턴스가됩니다.
생성 된 클래스를 모델 클래스에서 분리하는 문제를 해결하도록 도와 주실 수 있습니까?
감사합니다. 추신.
아마도 Swift 컴파일러 버그 일 것입니다. 하위 클래스의 인스턴스를 제대로 생성하지 않는 것 같습니다. 동적 디스패치 분석이 불완전하다고 생각하면 컴파일러가 하위 클래스를 올바르게 초기화하지 못합니다. 이 문제를 방지하려면 final
하위 클래스 선언 을 지정 합니다. 컴파일러가 하위 클래스의 이니셜 라이저를 호출하도록합니다.
final class AccountModel: Account { // add final keyword!
[...]
func foo(){
println("bar")
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다