2016-07-27 149 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() 

但是你可能會考慮使用泛型。