Я пытаюсь пометить переменную родового типа как слабое:
class X<T> {
weak var t: T?
}
Если я не ставил никаких ограничений для T
, я получаю ошибку weak cannot be applied to non-class type 'T'
.
Если бы я использовал его только с производными классами NSObject, это сработало бы:
class X<T: NSObject> {
weak var t: T?
}
Но я также хочу иметь возможность использовать чистые классы Swift.
Для протоколов можно потребовать, чтобы разработчик имел тип класса с помощью ключевого слова class
:
protocol ClassType: class {
}
С протоколом ClassType
я могу теперь отметить переменную как слабую:
class X<T: ClassType> {
weak var t: T?
}
Но я не могу добавить ключевое слово class
непосредственно к общему параметру:
class X<T: class> { // Compile error
weak var t: T?
}
Я могу заставить решение протокола работать для всех производных классов NSObject с расширением:
extension NSObject: ClassType {
}
Но для чистых классов Swift нет общего суперкласса, к которому я мог бы добавить это расширение. Есть ли способ сделать эту работу без добавления протокола ClassType
для каждого класса, с которым я хочу использовать класс X
? Например. некоторый специальный классификатор для общего параметра, такого как class X<T:ThisIsAClass>
?