繁体   English   中英

必须调用超类“ Day”错误的指定初始化器

[英]Must call a designated initializer of the superclass 'Day' error

在我的应用程序中,我尝试通过数据持久性保存数据,但出现此错误:必须调用超类“ Day”错误的指定初始化程序。

这是我的代码:

class Day: NSObject, NSCoding { // NEMA NSCODING I NSOBJECT
var dayName: String
var subjects: [Subject]?

init(dayName: String) {
    self.dayName = dayName
}

struct PropertyKey {
    static var dayName = "dayName"
    static var subjects = "subjects"
}

func encode(with aCoder: NSCoder) {
    aCoder.encode(dayName, forKey: PropertyKey.dayName)
    aCoder.encode(subjects, forKey: PropertyKey.subjects)
}

// Archiving paths
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("workingDays")//-namesto meals

required convenience init?(coder aDecoder: NSCoder) {
    guard let dayName = aDecoder.decodeObject(forKey: PropertyKey.dayName) as? String else {
        os_log("Unable to decode the dayName for a Day object.", log: OSLog.default, type: .debug)
        return nil
    }
    let subjects = aDecoder.decodeObject(forKey: PropertyKey.subjects) as? [Subject]
    self.init(dayName: dayName)
}

}

这是另一类:

class Subject: Day {
var subjectName: String
var startsAt: String?
init(dayName: String,subjectName: String) {
    self.subjectName = subjectName
    super.init(dayName: dayName)
}
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder) // here I get the error
}

}

我是否打算仅在Day类中实现数据持久性,以这种方式保存数据,为什么会出现该错误? 我是一个初学者,我正在根据此Apple文档进行操作-

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=12&cad=rja&uact=8&ved=0ahUKEwjWoIHk4uvXAhUHaFAKHbQFCHcQFghbMAs&url=https%3A%2F%2Fdeveloper.apple.com%2Flibrary%2Fcontent%2Freferencelibrary% 2FGettingStarted%2FDevelopiOSAppsSwift%2FPersistData.html&USG = AOvVaw24H5Uo4RyRY7NYIlztlgCj

任何帮助将非常感激。

根据必需的初始化程序的定义:

在定义类初始化器之前编写required修饰符,以指示该类的每个子类都必须实现该初始化器

覆盖必需的指定初始值设定项时,您无需编写override修饰符:

在您的情况下,您required对超类进行convenience initialiser ,所以子类必须立即实现它:

代码更正-:

class Subject: Day {
    var subjectName: String
    var startsAt: String?
    init(dayName: String,subjectName: String) {
        self.subjectName = subjectName
        super.init(dayName: dayName)
    }

    required convenience init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


}

该问题是由于在init?(coder Day init?(coder中调用self.init引起的。该调用使初始化方法convenient ,并且子类无法满足调用指定的初始化方法的要求。

解决方案是直接初始化属性

required init?(coder aDecoder: NSCoder) {
    self.dayName = aDecoder.decodeObject(forKey: PropertyKey.dayName) as! String
    self.subjects = aDecoder.decodeObject(forKey: PropertyKey.subjects) as? [Subject]
}

顺便说一句:您始终将 dayName编码为非可选字符串,因此在解码时永远不能为nil guard没用。

在子类中,您可能需要添加代码以对子类的属性进行编码/解码,并调用super以同时考虑超类的属性。

class Subject: Day {
    var subjectName: String
    var startsAt: String?

    init(dayName: String, subjectName: String) {
        self.subjectName = subjectName
        super.init(dayName: dayName)
    }

    override func encode(with aCoder: NSCoder) {
        super.encode(with: aCoder)
        aCoder.encode(subjectName, forKey: "subjectName")
        aCoder.encode(startsAt, forKey: "startsAt")
    }

    required init?(coder aDecoder: NSCoder) {
        subjectName = aDecoder.decodeObject(forKey: "subjectName") as! String
        startsAt = aDecoder.decodeObject(forKey: "startsAt") as? String
        super.init(coder: aDecoder)
    }
}

关于将子类用作其超类的属性的意义的问题是另一个故事another

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM