返回从中调用的类型的对象的方法

时间:2016-07-27 19:25:59

标签: ios swift generics

所以我有两个类BaseMore,看起来像这样

class Base:NSObject {
    class func whatsMineType() -> Base {
        return Base()
    }
}

class More:Base {

}

如果我调用方法Base.whatsMineType()More.whatsMineType(),他们都给了我Base类型的对象。有没有办法修改方法whatsMineType(),而不在Base覆盖它,所以它会返回从中调用的类型的对象?

我的目标是Base.whatsMineType()将返回Base类型对象,More.whatsMineType()将返回More类型对象。

我尝试使用泛型类型,但我对它们没有多少体验。任何建议都将受到超级赞赏。

修改

正如我试图解释的那样,这不是找到正确类型的重点,而是如何用正确的类型实例化对象。

2 个答案:

答案 0 :(得分:0)

函数whatsMineType()不返回类型(它可能应该),而是返回该类型的对象。它所做的只是初始化该类型的对象。

您应该使用初始化程序:

let base = Base()
let more = More()

因为它是一个类函数,所以函数是多余的,因为你需要直接在类型上调用它,所以你可以使用那个类型。

如果要获取类的类型以将其作为变量传递,可以使用

let baseType = Base.self
let moreType = More.self

如果要从其类型中实例化对象,只需使用

let base = baseType.init()
let more = moreType.init()

但您可以考虑使用泛型。

答案 1 :(得分:0)

当您处于静态范围时,您只需致电self.init()即可。您还必须定义required初始化程序,以确保可以使用它构造所有子类。

class Base : NSObject {

    // mark init() as required to ensure that all subclasses can be constructed with it
    required override init() {}

    class func whatsMineType() -> Self {
        return self.init()
    }
}

class More : Base {}

let b = Base.whatsMineType()
print(type(of: b)) // Base

let m = More.whatsMineType()
print(type(of: m)) // More