如何在Swift中初始化新的NSDocument实例?

如何在Swift中初始化新的NSDocument实例?,swift,nsdocument,Swift,Nsdocument,Apple文档建议覆盖NSDocument便利init(initWithType:error:),如前所述 然而,由于这是一个方便的初始化,我不能重写它。但在创建新文档时,我仍然需要执行一些代码。我不想在加载文档时执行该代码 在我的特殊情况下,我尝试初始化NSPersistentDocument,但我怀疑这是否相关 我该怎么做?为新文档执行初始化代码: // Create new document (only called for new documents) convenience init?

Apple文档建议覆盖NSDocument便利init(initWithType:error:),如前所述

然而,由于这是一个方便的初始化,我不能重写它。但在创建新文档时,我仍然需要执行一些代码。我不想在加载文档时执行该代码

在我的特殊情况下,我尝试初始化NSPersistentDocument,但我怀疑这是否相关


我该怎么做?

为新文档执行初始化代码:

// Create new document (only called for new documents)
convenience init?(type typeName: String, error outError: NSErrorPointer) {
    self.init()
    fileType = typeName
    // add your own initialisation for new document here
}

Swift中的问题是不能在super中调用方便的初始值设定项。相反,您必须在self中委托给指定的初始值设定项。这意味着您不能利用任何超级方便的初始化器,您必须自己实现初始化——因此上面的
fileType=typeName
。尽管我很喜欢Swift,但我发现这很愚蠢:重新实现可以重用的代码有什么意义

以上答案适用于Swift 1

必须在Swift 2中更改为回答以下问题:

convenience init(type typeName: String) throws {
    self.init()
    // Rest of initialization code here
}
答案如下:


因为这是一个常见的问题,所以为了方便起见重新发布。

您创建了NSPersistentDocument的子类。。。然后你在你的info.plist或任何地方设置它。。。所以,您的应用程序将该类与typeok关联,这个问题允许不同的解释。很抱歉我需要在创建后执行代码。这就是init所允许的便利性。但是我不知道现在在哪里做这件事,因为我不能再重写这个特定的init了。你说不能重写init是什么意思?根据文档,我应该重写便利init(initWithType:error:)。但是便利init不能调用super.init,只能调用self.init(=指定的init)。因此,我无法重写初始化器。我发现:如果您的子类通过按照规则1继承它们来提供其所有超类指定的初始化器的实现,或者通过提供自定义实现作为其定义的一部分,它会自动继承所有超类便利初始值设定项。谢谢,特别是对typeName的提示。