首页 > 解决方案 > 属性“self.readCount”未在 super.init 调用中初始化

问题描述

我有以下课程

// 学习项目

class LearningItem : NSObject {
    var id: String
    var title: String
    var subtitle: String?
    var image: String
    var uploadDate: Int

    init(id: String, title: String, image: String, uploadDate: Int) {
        self.id = id
        self.title = title
        self.image = image
        self.uploadDate = uploadDate
    }

我还有一堂课

// Book.swift

class Book: LearningItem {
    var publishDate: String?
    var author: String?
    var mediaUrl: String?
    var video : String?
    var tags: [String]?
    var lists: [String: AnyObject]?
    var readCount: Int
    var categories: [String]?
    var courses: [String]?
    var amazonBuyUrl: String?
    var starCount: Int
    var read: Bool?
    var completed = [String : Int]()
    var stars = [String : Int]()
    var completedDate : Int?

    var desc: String
    var epub: String
    var authorDesc: String

    init(id: String, title: String, desc: String, authorDesc: String, image: String, epub: String, readCount: Int, uploadDate: Int, starCount: Int) {

        super.init(id: id, title: title, image: image, uploadDate: uploadDate)

        self.id = id
        self.desc = desc
        self.authorDesc = authorDesc
        self.title = title
        self.epub = epub
        self.image = image
        self.readCount = readCount
        self.uploadDate = uploadDate
        self.starCount = starCount
    }

我收到错误“在 super.init 调用时未初始化属性‘self.readCount’”

我在 Book.swift 中调用“super.init(id:id,title:title,image:image,uploadDate:uploadDate)”

标签: iosswift

解决方案


类初始化直到指定的初始化程序没有完成所有属性的初始化才完成,之后您可以调用超类的指定初始化程序

指定初始化器是类的主要初始化器。指定的初始化程序完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续沿超类链的初始化过程。

所以

Swift 中的类初始化是一个两阶段的过程。在第一阶段,每个存储的属性都由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,第二阶段就开始了,每个类都有机会在新实例被认为可以使用之前进一步自定义其存储属性。

苹果文档https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

所以

class Book: LearningItem {
    var publishDate: String?
    var author: String?
    var mediaUrl: String?
    var video : String?
    var tags: [String]?
    var lists: [String: AnyObject]?
    var readCount: Int
    var categories: [String]?
    var courses: [String]?
    var amazonBuyUrl: String?
    var starCount: Int
    var read: Bool?
    var completed = [String : Int]()
    var stars = [String : Int]()
    var completedDate : Int?

    var desc: String
    var epub: String
    var authorDesc: String

    init(id: String, title: String, desc: String, authorDesc: String, image: String, epub: String, readCount: Int, uploadDate: Int, starCount: Int) {

        self.readCount = readCount
        self.starCount = starCount
        self.desc = desc
        self.epub = epub
        self.authorDesc = authorDesc

        super.init(id: id, title: title, image: image, uploadDate: uploadDate)


    }
}

推荐阅读