swift - 为什么两阶段初始化不适用于 swift 中的类?

标签 swift

我开始学习 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/

相关文章:

ios - 如何从标签栏按钮呈现 View Controller

ios - 将图像从 Online mysql 数据库加载到 UICollectionView Swift

ios - 如何在 Swift 中对多个按钮使用一个 IBAction?

匹配所有形式的整数文字的正则表达式模式

ios - 在 Swift 中有一个具有多种类型的变量

快速向下转换失败

ios - 如何将数据从uitableviewcontroller发送到uitableviewcell

swift - 我的实现与(状态)单子(monad)具有可比性/相关性吗?

ios - 如何在 iOS 中打开文件?

swift - macOS 中的多页面应用程序