我开始学习快速知识,并找到了一个名为两阶段初始化的课程。该示例是针对结构给出的,并且可以正常工作。下面给出了结构类型的示例:
import UIKit
struct NuclearRocket{
var meters: Double
var liters: Double
init(meters: Double, liters: Double){
self.meters = meters
self.liters = liters
}
init(ft: Double, gallon: Double){
let convertedMeters = ft / 3.28
let convertedLiters = gallon * 3.78
self.init(meters: convertedMeters , liters: convertedLiters)
}
}
var rocket = NuclearRocket(meters: 20, liters: 20)
rocket.liters
rocket.meters
var newRocket = NuclearRocket(ft: 2, gallon: 3)
newRocket.meters
newRocket.liters
它正常工作并显示确切的输出。但是,当我将 struct 替换为 class (使用 class NuclearRocket 而不是 struct NuclearRocket )时,我的编译器告诉我:
Designated initializer for 'NuclearRocket' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer?
在这种情况下,使用class和struct的实际区别是什么?
答案 0 :(得分:3)
在Swift类中,指定的初始值设定项不能自己调用另一个指定的初始值设定项。类中的指定初始值设定项只能调用其超类的指定初始值设定项(如果有)。
在Swift类中,便利初始化器只能在自身上调用指定的初始化器(如果有,则不能在超类上调用)。
这些类规则是由于类继承而产生的。即使您的班级没有超类,规则也适用。这一切都在Class Inheritance and Initialization下的Swift书中涵盖。
如果将init(ft: Double, gallon: Double)
初始化程序更改为便捷初始化程序,则您的代码作为类将起作用。
Swift结构的规则略有不同,因为结构不支持继承。结构不需要使用便捷初始化程序,这就是您原始结构代码起作用的原因。这一切都在nitializer Delegation for Value Types下的Swift书中涵盖。