【问题标题】:Cannot assign to self in a method - Swift无法在方法中分配给自我 - Swift
【发布时间】:2014-10-21 00:12:55
【问题描述】:

在 Xcode 6.1 和 Swift 博客上关于 Failable Initializers 的博客文章中,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
        }
    }
}

(Contact 是 NSManagedObject 的子类)

失败的初始化器有什么我遗漏的吗?

【问题讨论】:

标签: ios swift xcode6


【解决方案1】:

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。嗯......我认为你不应该使用 可失败的初始化器。

【讨论】:

  • 不必删除,除非您似乎必须在返回 nil 之前调用 self.init(entity。在调用指定的初始化程序之前无法进行检查。
【解决方案2】:

便利构造器必须调用同一个类的指定构造器。除了分配给self,您可以创建一个指定的初始化程序来获取并复制Contact 实例吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多