Я знаю, что это не совсем отвечает на вопрос, и я мучаюсь из-за одной и той же проблемы в течение длительного времени. Мне бы очень хотелось увидеть правильный ответ на ваш вопрос :)
тандартный шаблонный слабый контейнер в Swift.
struct Weak<T: AnyObject> {
weak var value: T?
init(value: T) {
self.value = value
}
}
Это хорошо работает, если вы не хотитеT
быть протоколом, например,
protocol ImplementationHiding: class {}
class Implementation: ImplementationHiding {}
let w = Weak(value: Implementation() as ImplementationHiding)
Это не компилируется, к сожалению. Единственный способ найти работу - это представить@objc
по протоколу:
@objc protocol ImplementationHiding {}
Единственный способ, который я нашел, довольно уродливый, так как он исключает безопасность во время компиляции.
struct Weak<T> {
private let get: () -> T?
init(value: AnyObject, type: T.Type = T.self) {
get = { [weak value] in value as! T? }
}
var value: T? {
return get()
}
}
Как я могу создатьWeak
с родным протоколом Swift какT
?