无法在方法中分配给自己 - Swift

时间:2014-10-21 00:12:55

标签: ios swift xcode6

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

可用的初始化器有什么我遗漏的吗?

2 个答案:

答案 0 :(得分:4)

Assigning to 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(..),因为它是convenience初始化程序的规则。 如果条件为falsedeleteObject(self)return nil。嗯......我认为你不应该使用 这个可用的初始化器。

答案 1 :(得分:0)

便捷初始化程序必须从同一个类调用指定的初始化程序。您可以创建一个指定的初始值设定项来获取和复制self实例,而不是分配给Contact吗?