【发布时间】:2025-12-29 03:40:11
【问题描述】:
所以我有一个带有指定初始化程序的类,它为每个存储的属性获取值。 我所有存储的属性也有一个默认值,所以我假设这个类有一个默认的 init。
在我指定的init中,我调用super.init()
问题是,如果我在初始化结束时调用它,它会将所有属性加载到默认值,但如果我在开始时调用它,它会按预期工作。
书上说:
安全检查 1 指定的初始化程序必须确保所有 其类引入的属性在其委托之前被初始化 直到一个超类初始化器。
如上所述,一个对象的内存只被认为是完全的 一旦其所有存储属性的初始状态被初始化 已知。为了满足这个规则,一个指定的 初始化器必须确保它自己的所有属性都被初始化 在它离开链条之前。
所以我不确定事情是否发生了变化或者我做错了什么?
代码:
class ORQuizViewController: UIViewController {
let imageView: UIImageView = UIImageView(image: nil)
let questionLabel: UILabel = UILabel()
let choicesArray: [BlackWhiteButton] = [BlackWhiteButton]()
let correctAnswer: Int = -1
init(image: UIImage!, question: String, choices: [String], answerIndex: Int) {
super.init()
imageView = UIImageView(image:image)
questionLabel = UILabel()
questionLabel.text = question
var tempChoices = [BlackWhiteButton]()
for choice in choices {
var choiceLabel = BlackWhiteButton()
choiceLabel.setTitle(choice, forState: .Normal)
tempChoices.append(choiceLabel)
}
choicesArray = tempChoices
correctAnswer = answerIndex
}
【问题讨论】:
-
属性是这个类定义的还是继承自超类?
-
它们是由这个类定义的,所以根据Apple的文档,我应该在调用super之前进行初始化。
-
您的初始化程序是标记为方便还是指定初始化程序?
-
为清晰起见添加了代码。应该回答你的问题。
-
为什么要将值设置为默认值并且有一个指定的初始化器来设置默认值?