gpt4 book ai didi

swift - 为什么必须使用元类型值构造类类型为 'someClass' 的对象使用 'required' 初始值设定项?

转载 作者:IT王子 更新时间:2023-10-29 05:21:31 25 4
gpt4 key购买 nike

class Animal {
class func generate() -> Animal {
return self()
}
}

编译器提示构造具有元类型值的类类型“Animal”的对象必须使用“必需”初始化器

这个我可以理解。如果我这样写一个子类:

class SubAnimal: Animal {
let head: Int
init(head: Int) {
self.head = head
super.init()
}
}

它将继承Animal 的类方法generate() 但不会继承其默认初始化程序init()。所以 SmallAnimal.generate() 实际上调用了 SmallAnimal(),但是 SmallAnimal 没有初始化器 init()!当然这是编译器想要阻止的。

让我困惑的是一个类似的问题。

class someClass {

}
let anotherClass = someClass.self
let anotherObject = anotherClass()

编译器仍然提示构造具有元类型值的类类型“Animal”的对象必须使用“必需”初始化器

这一次,我无法理解。 anotherClass是一个元类型值,但是会造成什么不好的结果呢?

我知道如何解决这个问题,添加 required init() {} 是解决方案。但是我真的很想知道第二种情况的原因。

最佳答案

考虑我们还有一个子类的情况:

class SomeClass {

}

class SomeSubclass : SomeClass {

}

如果将类类型存储在变量中:

var anotherClass = SomeClass.self

变量anotherClass的类型是SomeClass.Type

您稍后可以将此变量分配给子类:

anotherClass = SomeSubclass.self

这是有效的,因为 SomeSubclass.Type 是一个 SomeClass.Type。此时,如果未在子类中实现初始化程序,anotherClass() 将失败。这是编译器要防止的。

在您的示例代码中,这是不可能的:您使用了 let 而不是 var 因此无法更改类型。可能是安全检查不够细致,没有注意到这一点。

关于swift - 为什么必须使用元类型值构造类类型为 'someClass' 的对象使用 'required' 初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163124/

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