gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:14 25 4
gpt4 key购买 nike

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

在这种情况下使用 class 和 struct 之间的实际区别是什么?

最佳答案

在 Swift 类中,一个指定的初始化器不能调用另一个指定的初始化器。类中的指定初始化器只能调用其父类(super class)(如果有的话)的指定初始化器。

在 Swift 类中,便利构造器只能调用自身的指定构造器(如果有父类,则不能)。

这些类规则是由于类继承而产生的。即使您的类(class)没有超类(class),这些规则也适用。所有这些都包含在 Class Inheritance and Initialization 下的 Swift 书中。 .

如果您将 init(ft: Double, gallon: Double) 初始化器更改为便捷初始化器,您的类代码将可以正常工作。

Swift 结构体的规则略有不同,因为结构体不支持继承。结构不需要使用便利初始值设定项,这就是您的原始结构代码起作用的原因。所有这些都包含在 nitializer Delegation for Value Types 下的 Swift 书中。 .

关于swift - 为什么两阶段初始化不适用于 swift 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com