在Xcode 6.1和Swift博客上关于Failable Initializers的博客文章中,Apple已经在一个可用的初始化程序中分配给自己。
博客文章中的Int(init(fromString :))示例在复制到我的项目时编译得很好,但是在我自己的代码中尝试使用自定义类会导致通常的错误“无法分配给“自我”的方法“。
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的子类)
可用的初始化器有什么我遗漏的吗?
答案 0 :(得分:4)
Assigning to 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
。嗯......我认为你不应该使用
这个可用的初始化器。
答案 1 :(得分:0)
便捷初始化程序必须从同一个类调用指定的初始化程序。您可以创建一个指定的初始值设定项来获取和复制self
实例,而不是分配给Contact
吗?