Swift - 按动态类型加载类

时间:2017-02-12 18:29:56

标签: ios swift class

我在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()
    }
}

正如你所看到的,这两种方法是相同的。但我必须在每个班级写出来,但不同类型。

是否可以写一个"动态"静态(或非静态)方法,它在一个地方完成,而不是一次又一次地在每个类中编写这个方法?

1 个答案:

答案 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确保我们所依赖的初始化程序确实存在并且没有以这种方式丢失。