【问题标题】:A guess that the Swift type alias mechanism is the automatic initializer Inheritance一个猜测 Swift 类型别名机制是自动初始化器继承
【发布时间】:2016-07-10 19:41:08
【问题描述】:

我脑子里突然冒出一个问题,当我定义一个 Swift 类型别名时会发生什么?其背后的机制是什么?直到我从 Swift 官方文档中了解到 Automatic Initializer Inheritance 一章:

如果你的子类没有定义任何指定的初始化器,它会自动继承它的所有超类的指定初始化器

这是我的学习练习代码​​

class Vehicle{
    var numberOfWheels = 0
    var description: String {
        return "\(numberOfWheels) wheel(s)"
    }
}

class Auto: Vehicle{}

let VM = Auto()
VM.numberOfWheels

哇!这工作,至少执行,与 Swift 类型别名完全一样。 AutoVehicle

类型的别名

问题:我理解对了吗?这是类型别名背后的机制。

【问题讨论】:

  • Auto 不是类型别名,它是Vehicle 的子类
  • @vadian 所以类型别名实际上在它定义的原始类的同一级别。但是子类在子级别,它继承自超类
  • 类型别名是一个同义词,可以用来代替原始术语,例如NSTimeIntervalDouble 的类型别名,可以在任何需要Double 的地方使用。

标签: swift initialization type-alias


【解决方案1】:

问题:我理解对了吗?这就是类型别名背后的机制。

不,类型化和子类化(继承所有方法和初始化程序)是不同的东西,并且基于不同的语义和机制。

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 实际上是一个别名,它为同一类型提供了另一个名称。


还有,可以定义结构体或枚举的类型别名,不能定义继承的类(类型)。

【讨论】:

  • 非常好的例子和额外的信息,非常感谢:)
【解决方案2】:

并非如此,但如果您从未见过面向对象编程,它们可能看起来有些相似,我同意。

Auto 是一个扩展原始车辆的子类,并且可以向Vehicle 添加其他属性和方法,即使在该示例中它没有这样做。

AutoVehicle 不是一回事,Vehicle 是基本类型,Auto 是它的子类型之一,Vehicle 可以做什么,@ 可以做什么987654328@ 但反之则不然。

类型别名只是一个别名,一种为预先存在的类型赋予和附加“名称”的方式,仅此而已。一个类型和他的别名是一回事。

【讨论】:

  • “你可以用车辆做什么,你可以用汽车做什么,反之亦然。”多么好的解释!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多