问题突然出现在我脑海中,当我定义一个Swift类型的别名时会发生什么?它背后的机制是什么?直到我从Swift官方文档中学习了自动初始化程序继承章节:
如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项
这是我的学习练习代码
class Vehicle{
var numberOfWheels = 0
var description: String {
return "\(numberOfWheels) wheel(s)"
}
}
class Auto: Vehicle{}
let VM = Auto()
VM.numberOfWheels
哇!这工作,至少执行,与Swift类型别名完全相同。 自动是车辆
类型的别名问题:我明白了吗?这是类型别名背后的机制。
答案 0 :(得分:2)
问题:我明白了吗?这是类型别名背后的机制。
不,类型化和子类化(继承所有方法和初始化器)是不同的东西,并且基于不同的语义和机制。
let v1 = Vehicle()
v1 is Auto //->false
typealias Norimono = Vehicle
v1 is Norimono //->true (with warning "'is' test is always true)
最后一个结果(包括您可能会发现的警告)与v1 is Vehicle
完全相同。
Typealias实际上是一个别名,它为同一类型提供了另一个名称。
另外,您可以定义结构或枚举的类型,您无法定义继承的类(类型)。
答案 1 :(得分:1)
不是真的,但如果你从未见过面向对象的编程,他们看起来有点相似,我同意。
Auto
是扩展原始工具的子类,可以向Vehicle
添加其他属性和方法,即使在该示例中它不执行此操作也是如此。
Auto
和Vehicle
不是一回事,Vehicle
是基本类型而且Auto
是其子类型之一,您可以使用{ {1}}您可以使用Vehicle
,但反之亦然。
一个typealias只是一个别名,一种为预先存在的类型提供额外“名称”的方法,就是这样。一个类型和他的别名是一回事。