如何在Swift Generic类中使用AnyClass

时间:2015-09-05 17:48:31

标签: ios xcode swift generics swift2

我需要在我的通用基类中传递一个类型。

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

我收到以下错误:

  

继承自非协议,非类型&#39; AnyClass&#39; (又名   &#39; AnyObject.Type&#39)

理想情况下,我想使用&#39; T&#39;作为特定类型而不是AnyClass,但AnyClass也可以。

由于

3 个答案:

答案 0 :(得分:4)

您可以改为执行以下操作:

,而不是指定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可以表示结构和枚举,以及类。

答案 1 :(得分:4)

如果您希望类型为类,则应使用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>()

答案 2 :(得分:1)

你可以做到这一点:

protocol P {}

class C: P {}

class C1<T: P> {}

let c1 = C1<C>() 

在这种情况下,您使用协议C将类P打包,然后您就可以创建新的通用类C1,其中T是您的协议P 。这允许您使用泛型参数类C1创建C类的实例。