我在Swift中有点新鲜。 我有一些方法,以相同的方式显示在几个类中,但只有不同的类型。它看起来像这样:
class func loadDevice() -> Device
{
let object = super.loadFromDisk()
if object != nil
{
return object! as! Device
}
else
{
return Device.init()
}
}
class func loadUser() -> User
{
let object = super.loadFromDisk()
if object != nil
{
return object! as! User
}
else
{
return User.init()
}
}
正如你所看到的,这两种方法是相同的。但我必须在每个班级写出来,但不同类型。
是否可以写一个"动态"静态(或非静态)方法,它在一个地方完成,而不是一次又一次地在每个类中编写这个方法?
答案 0 :(得分:3)
您想要的工具是Self
。
class Thing {
class func loadFromDisk() -> Self? {
// Do something to load from disk, or return nil if you can't
// subclasses can override this if appropriate
return nil
}
class func create() -> Self {
// Try to load it from disk, but if we can't, create one
return loadFromDisk() ?? self.init()
}
required init() {}
}
class User: Thing {}
init
方法标记为required
以强制每个子类以某种方式实现它。但是,如果它继承了,那就好了。请记住,如果您创建自定义指定的初始化程序,那么您将失去所有继承的初始值设定项,因为它们不再有效(它们不会调用您指定的初始化程序,您说这是强制性的;这就是什么"指定的初始化程序"是)。 required
确保我们所依赖的初始化程序确实存在并且没有以这种方式丢失。