Общие ограничения для класса в Swift
Я пытаюсь пометить переменную родового типа как слабое:
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>
?
Ответы
Ответ 1
Вы хотите AnyObject
, который документы Swift описывают как:
Протокол, к которому неявно соответствуют все классы.
class X<T: AnyObject> {
weak var t: T?
}
class C { }
let x = X<C>() // works fine
x.t = C()
// error: type 'Int' does not conform to protocol ‘AnyObject’
// (because Int is a struct)
let y = X<Int>()