2015-09-05 51 views
5

我需要在我的泛型基類中傳遞一個類型。如何在Swift中使用AnyClass通用類

class SomeBaseClass<T: AnyClass> { 
    // Implementation Goes here 
} 

我得到以下錯誤:

Inheritance from non-protocol, non-class type 'AnyClass' (aka 'AnyObject.Type')

理想我想用「T」是爲一個特定的類型,而不是AnyClass,但AnyClass是OK爲好。

感謝

回答

3

除了指定T需求是一類的,你可以改爲做:

class SomeBaseClass<T> { 
    let type: T.Type 

    init(type: T.Type) { 
     self.type = type 
    } 
} 

如果你打算使用T.Type很多它可能是值得使用typealias

class SomeBaseClass<T> { 
    typealias Type = T.Type 
    let type: Type 
    ... 
} 

一些示例用法:

let base = SomeBaseClass(type: String.self) 

這種方法的優點是T.Type可以代表結構和枚舉,以及類。

+0

這很有趣,我會試試看。 – Peymankh

+0

整潔。謝謝,那會做。 – Peymankh

1

如果您希望該類型爲類,則應該使用AnyObject

class SomeBaseClass<T: AnyObject> { 
    // Implementation Goes here 
} 

// Legal because UIViewController is a class 
let o1 = SomeBaseClass<UIViewController>() 

// Illegal (won't compile) because String is a struct 
let o2 = SomeBaseClass<String>() 
1

你可以做到這招:

protocol P {} 

class C: P {} 

class C1<T: P> {} 

let c1 = C1<C>() 

在這種情況下,你換你C類協議P,那麼你就能夠創造出新的通用類C1其中T是你的協議P。這允許您使用泛型參數類C創建C1類的實例。