NSManagedObject在Swift中实现协议的EXC_BAD_ACCESS错误

我有以下两种方法:

func isAuthenticated() -> Bool { var currentUser: CurrentUser? = self.getCurrentUser() if currentUser == nil { return false } self.token = getUserToken(currentUser!.username) if self.token == nil { return false } if !tokenIsValidForUser(self.token!, user: currentUser!) { return false } return true } func tokenIsValidForUser(token: AuthenticationToken, user: UserObject) -> Bool { if token.username != user.username { return false } return true } 

当我调用isAuthenticated() ,它在tokenIsValidForUser()的第一行失败,显然在CurrentUser对象上。

我的理解是,当对象不存在时,你会得到这种错误,但我不明白为什么会这样。

对象typesCurrentUser被声明为:

 protocol UserObject { var username: String { get set } } class CurrentUser: NSManagedObject, UserObject { @NSManaged var username: String } 

我在这里find了这个问题的解决scheme:

http://lesstroud.com/dynamic-dispatch-with-nsmanaged-in-swift/

实质上,这是在NSManaged的对象上实现协议时Swift的怪癖。 我不得不将dynamic关键字添加到CurrentUser类的@NSManaged属性中,以便类如下所示:

 class CurrentUser: NSManagedObject, UserObject { @NSManaged dynamic var username: String }