在Xcode 6.1和Swift博客上关于Failable初始化程序的博客文章中,Apple已在可失败初始化程序中分配给self。
博客文章中的Int(init(fromString:))示例在将赋值复制到我的项目中时编译良好,但在我自己的代码中使用自定义类尝试此示例会导致通常的错误“无法在方法中分配给'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
}
}
}
(联系人是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(…)
,因为,这是方便
初始化程序的规则。如果条件是false
,deleteObject(self)
和返回nil
。嗯….我认为您不应该为此使用可失败的初始化程序。
便利初始化器必须调用来自同一类的指定初始化器。您可以创建一个指定的初始化器来接受和复制联系
实例,而不是分配给self
吗?