Как использовать AnyClass в Swift Generic class

Мне нужно передать тип в моем общем базовом классе.

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

Я получаю следующую ошибку:

наследование от не протокольного, неклассового типа " AnyClass "(он же 'Какой-либо объект.Type')

В идеале я хотел бы использовать 'T' как определенный тип, а не AnyClass, но AnyClass также в порядке.

спасибо

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 может представлять структуры и перечисления, а также классы.


вы должны использовать 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>()

вы можете сделать этот трюк:

protocol P {}

class C: P {}

class C1<T: P> {}

let c1 = C1<C>() 

в этом случае вы оберните класс C С протоколом P, тогда вы можете создать новый универсальный класс C1 здесь T протокол P. Это позволит вам создать экземпляр C1 класс с общим параметром class C.