2017-09-30 35 views
5

我想封裝一個通用對象另一類沒有設置泛型類型參數。我創建了一個基類Animal<T>,並從中定義了其他的子類。例如:如何在Swift中使用不帶類型參數的泛型類?

public class Animal<T: YummyObject> { 
    // Code 
} 

public class Dog: Animal<Bark> { 
    // Code 
} 

public class Cat: Animal<Meow> { 
    // Code 
} 

和定義的Animal財產,沒有類型參數,在UITableView延伸波紋管:

extension UITableView { 
    private static var animal: Animal! 

    func addAnimal(animal: Animal) { 
     UITableView.animal = animal 
    } 
} 

但這樣做的時候,我得到了以下編譯錯誤:

引用泛型類型Animal需要<...>參數。

這似乎在Java罰款。我怎樣才能在Swift中完成同樣的事情呢?

+1

能否請你告訴我們什麼是喵和樹皮。它是一個類,還是一個協議。此外,你想給動物分配一張表的原因是什麼,而不是一些協議。順便說一句,汽車不喵喵叫,它發出蜂鳴 – iWheelBuy

+2

@iWheelBuy這是一個虛擬的對象和類 –

+0

我會懷疑這是否是一般情況。除非您顯示更多相反的信息,否則這看起來像是協議的用例,而不是通用的。 – matt

回答

4

斯威夫特還不支持wildcard-style generics像Java那樣(即Animal<?>)。這樣,一個共同的模式是定義一個型擦除超類,協議(或包裝器),以使這樣的使用來代替。例如:

public class AnyAnimal { 
    /* non-generic methods */ 
} 

,然後用它作爲你的超:

public class Animal<T: YummyObject>: AnyAnimal { 
    ... 
} 

最後,在非通用代碼中使用AnyAnimal代替:在斯威夫特標準

private static var animal: AnyAnimal! 

例子圖書館。對於一個實際的例子,看到KeyPathPartialKeyPath,並AnyKeyPath類層次結構。它們遵循上面概述的相同模式。 Collections framework提供了更多的類型擦除示例,但使用包裝代替。

相關問題