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

标签 ios swift xcode6

在 Xcode 6.1 中以及关于 Failable Initializers 的博文在 Swift 博客上,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的子类)

我是否遗漏了可失败初始化器的任何内容?

最佳答案

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 初始化程序的规则。 如果条件为 false,则 deleteObject(self)返回 nil。嗯...我认为你不应该使用 可失败的初始值设定项。

关于ios - 无法在方法中分配给自己 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476964/

相关文章:

ios7 - 在 Xcode6 中针对 iOS7.1 或 7.0 时,应用程序中出现黑条

ios - 在 subview 中应用任何 "transform"后缩放 UIScrollView

ios - Sqlite 数据库巨大的记录在我的 ios 应用程序中获取

iphone - 如何在 iPad 应用程序中显示 GridView 等数据

swift - :url loads url content of a truncated URL 的内容

ios - Swift - CollectionViewCell 标签在我重新加载后移动位置

ios - AVplayer 在来电后恢复

ios - `convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`

iOS 指定初始化器 : Using NS_DESIGNATED_INITIALIZER

ios - 应用程序图标未分配图像编译警告消息