在Xcode 6.1中,随着Swift博客上关于Failable Initializers的博客文章,苹果将self分配给了一个Failable initializer。
博客文章中的Int(init(fromString:))示例在通过对self的赋值复制到我的项目中时编译良好,但在我自己的代码中使用自定义类进行尝试会导致常见的错误"无法在方法中分配给self"。
extension Contact {
public convenience init?(context: NSManagedObjectContext = DataStore.managedObjectContext) {
if let userId = User.loggedInUserId(context) {
let contact = NSEntityDescription.insertNewObjectForEntityForName("Contact", inManagedObjectContext: context) as Contact
self = contact
} else {
return nil
}
}
}
(Contact是NSManagedObject的子类)
故障初始化程序有什么遗漏吗?
分配给self
仅适用于值类型struct
和enum
。
在你的情况下,你应该这样做:
public convenience init?(context: NSManagedObjectContext) {
let entity = NSEntityDescription.entityForName("Contact", inManagedObjectContext: context);
self.init(entity: entity!, insertIntoManagedObjectContext: context)
if User.loggedInUserId(context) == nil {
context.deleteObject(self)
return nil
}
}
您必须无条件地调用self.init(..)
,因为这是convenience
初始值设定项的规则。如果条件是false
、deleteObject(self)
和return nil
。嗯…我认为你不应该使用此的故障初始化程序。
便利初始化器必须从同一类调用指定的初始化器。您可以创建一个指定的初始值设定项来获取和复制Contact
实例,而不是分配给self
吗?