提问者:小点点

无法在方法中分配给self-Swift


在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的子类)

对于可失败的初始化程序,我是否遗漏了什么?


共2个答案

匿名用户

分配给self仅适用于值类型,structenum

在你的情况下,你应该这样做:

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(…),因为,这是方便初始化程序的规则。如果条件是falsedeleteObject(self)返回nil。嗯….我认为您不应该为此使用可失败的初始化程序。

匿名用户

便利初始化器必须调用来自同一类的指定初始化器。您可以创建一个指定的初始化器来接受和复制联系实例,而不是分配给self吗?