我开始学习 swift 并找到了一门名为两阶段初始化的类(class)。该示例是针对结构给出的,并且它可以正常工作。结构类型示例如下:
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
它工作正常并显示准确的输出。但是当我用 class 替换 struct (使用 class NuclearRocket 而不是 struct NuclearRocket)时,我的编译器告诉我:
Designated initializer for 'NuclearRocket' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer?
在这种情况下使用类和结构之间的实际区别是什么?
最佳答案
在 Swift 类中,指定的初始值设定项无法自行调用另一个指定的初始值设定项。类中的指定初始化器只能调用其父类(super class)(如果有的话)的指定初始化器。
在 Swift 类中,便利初始化程序只能调用其自身指定的初始化程序(如果有父类(super class),则不能调用)。
这些类规则是由于类继承而产生的。即使您的类没有父类(super class),这些规则也适用。这一切都在 Swift 书中的 Class Inheritance and Initialization 下进行了介绍。 .
如果将 init(ft: Double, gallon: Double)
初始化器更改为方便初始化器,则作为类的代码将起作用。
Swift 结构体的规则略有不同,因为结构体不支持继承。结构不需要使用方便的初始化程序,这就是原始结构代码可以工作的原因。这一切都在 Swift 书中的 nitializer Delegation for Value Types 下进行了介绍。 .
关于swift - 为什么两阶段初始化不适用于 swift 中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175492/