为什么两阶段初始化不能迅速为该类工作?

时间:2019-01-14 03:37:26

标签: swift

我开始学习快速知识,并找到了一个名为两阶段初始化的课程。该示例是针对结构给出的,并且可以正常工作。下面给出了结构类型的示例:

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的实际区别是什么?

1 个答案:

答案 0 :(得分:3)

在Swift类中,指定的初始值设定项不能自己调用​​另一个指定的初始值设定项。类中的指定初始值设定项只能调用其超类的指定初始值设定项(如果有)。

在Swift类中,便利初始化器只能在自身上调用指定的初始化器(如果有,则不能在超类上调用)。

这些类规则是由于类继承而产生的。即使您的班级没有超类,规则也适用。这一切都在Class Inheritance and Initialization下的Swift书中涵盖。

如果将init(ft: Double, gallon: Double)初始化程序更改为便捷初始化程序,则您的代码作为类将起作用。

Swift结构的规则略有不同,因为结构不支持继承。结构不需要使用便捷初始化程序,这就是您原始结构代码起作用的原因。这一切都在nitializer Delegation for Value Types下的Swift书中涵盖。