【问题标题】:Must call a designated initializer of the superclass 'Day' error必须调用超类“Day”错误的指定初始化程序
【发布时间】:2018-05-16 13:09:38
【问题描述】:

在我的应用程序中,我尝试使用数据持久性来保存数据,但出现此错误: 必须调用超类“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 类中实现数据持久性,为什么会出现该错误? 我是初学者,我是根据这个苹果文档做的 -

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

任何帮助将不胜感激。

【问题讨论】:

    标签: swift data-persistence


    【解决方案1】:

    问题是在Dayinit?(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]
    }
    

    顺便说一句:您将 always dayName 编码为 non-optional 字符串,因此在解码时它永远不会是 nilguard 没用。

    在子类中,您可能需要添加代码来对子类的属性进行编码/解码,并调用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)
        }
    }
    

    在其超类中使用子类作为属性的意义是另一回事?

    【讨论】:

    • 实际上现在我不确定这段代码会做什么。它会永久保存这些类中的数据还是我必须编写一些其他代码才能做到这一点。感谢您的帮助,我在这里很新。
    【解决方案2】:

    根据Required Initializers的定义-:

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

    在重写所需的指定初始化程序时,不要编写 override 修饰符:

    在您的情况下,您创建了超类requiredconvenience 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:) has not been implemented”...
    猜你喜欢
    • 2014-09-29
    • 2021-11-18
    • 2016-03-11
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多