2017-06-01 44 views
1

我想知道是否有可能允許方法接受泛型超類的任何子類。我已經發布了下面我想要實現的示例代碼。希望能夠更好地描述我的情況。Swift泛型 - 允許作爲參數傳遞的子類

import UIKit 

class SuperDataClass { 

} 

class SubDataClass: SuperDataClass { 

} 

class SuperClass<T: SuperDataClass>: UITableViewCell { 

} 

class SubClass: SuperClass<SubDataClass> { 

} 

class Example { 
    func test(object: SuperClass<SuperDataClass>) { 
     print(object) 
    } 
} 

let object = SubClass() 
Example().test(object: object) 

當在操場上運行此,你會得到以下錯誤:

Playground execution failed: error: Generics.playground:20:24: error: cannot convert value of type 'SubClass' to expected argument type 'SuperClass<SuperDataClass>' 

究其原因,據我所知,是數據類型的數據類型的子類預期的方法。

行更改15

class SubClass: SuperClass<SuperDataClass> { 

將解決這個問題,但並不適用於我想要實現的方案。我希望該方法可以處理任何繼承SuperClass的對象,以便通過此方法處理。這可能嗎?是否有更好的設置,我應該用來實現這一目標?

謝謝。

回答

0

test通用:

class Example { 
    func test<T>(object: SuperClass<T>) { 
     print(object) 
    } 
} 
+0

感謝這個信息,我現在好奇我們如何能做類似的事情,但對於一個將返回類似項目的方法。 我正在嘗試一些方法,但尚未找出正確的方法來完成這項工作。 'FUNC返回類型() - >ü。鍵入{ 返回SubClass.self }' – Steve

+0

這不會因爲'T'工作和'U'可以是任何類型的滿足約束。你想要做什麼?另外,我懷疑這應該是一個單獨的問題。 @Steve – Sweeper

+0

我同意,這是一個單獨的問題。基本上我希望通過解決上面的例子(你的答案確實解決了這個問題)能理解我是如何能夠傳遞一個通用超類的多個子類版本的。我有多個tableviewcell,每個tableviewcell都繼承了一個tableviewcell,它知道如何將數據放在自己的位置。每個子類的數據類型都不相同。這非常精細,我可能不會很好地解釋它。爲了解決這個問題,我們將繼續挖掘並嘗試新問題。謝謝。 – Steve

0

父類< SuperDataClass>不是一個超類父類< SubDataClass>,它是使用相同的通用的,但不一樣的關聯類型不同的類。

泛型的關聯類型是其他類的子類的事實並不隱含地將泛型類作爲其祖先。

例如,如果你要重寫父類< SubDataClass的方法>(或亞類),你將被重寫父類< T>,不超< SuperDataClass>。

在通用的聲明中< T:SuperDataClass>是使用SuperClass的約束,而不是層次關係。

相關問題