2016-07-27 50 views
0

叫类型的对象,因此我有两个类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类型的对象。

我试过用泛型类型,但我没有太多的经验与他们。任何建议将超级赞赏。

编辑

当我试图解释,这不是正确的找到类型,而是如何实例化对象,具有正确的点。

+0

为什么不重写whatsMineType in More? – WMios

+0

因为我有更多的类型扩展了'Base',我不想在每一个中重写'whatsMineType()'。这就是为什么'基地'的原因。 –

+0

[你如何找出对象的类型(在Swift中)?](http://stackoverflow.com/questions/24101450/how-do-you-find-out-the-type-of- an-object-in-swift) – WMios

回答

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 
+0

而这正是我所寻找的。谢谢:) –

+0

@JoeBlow的确,它已经,谢谢提示(当Swift 3出来时,我没有足够的能量来更新我所有的答案:)) – Hamish

0

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

您应该使用这一个初始化:由于它是一类功能

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

,功能是多余的,因为你需要直接调用它的类型,所以你可以只使用类型,然后。

如果你想获得一个类的类型,把它作为一个变量,你可以使用

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

当你想要实例从其类的一个对象,只是使用

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

但是你可能会考虑使用泛型。