Я знаю, что это не совсем отвечает на вопрос, и я мучаюсь из-за одной и той же проблемы в течение длительного времени. Мне бы очень хотелось увидеть правильный ответ на ваш вопрос :)

тандартный шаблонный слабый контейнер в 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?

 Gregory Higley22 нояб. 2017 г., 21:14
Да, это похоже на суть SR-55.
 Hamish22 нояб. 2017 г., 19:16
Вы можете вернуть безопасность типа, передав закрытие:init<U : AnyObject>(_ value: U, upcast: @escaping (U) -> T) { self.get = { [weak value] in value.map { upcast($0) } } } (тогда при звонке просто пас{ $0 } возмущаться отImplementation вImplementationHiding). Хотя досадно, что при создании обёртки потребуется знать конкретный тип бетона, и это не позволитvalue быть настраиваемым внешним миром.
 Hamish22 нояб. 2017 г., 19:17
Но да, главная проблема здесь в том, чтопротоколы не всегда соответствуют.
 Gregory Higley22 нояб. 2017 г., 18:59
Некоторые раскопки, которые я только что сделал, показывают мне, что это, скорее всего, невозможноbugs.swift.org/browse/SR-55.

Ответы на вопрос(1)

Решение Вопроса

вы можете изменитьWeak принятьAny какT а затем сохранить значение какAnyObject:

struct Weak<T: Any>{
    weak var value: AnyObject?

    public var ref: T? {
        get {
            return value as? T
        }
    }

    init(value: T) {
        self.value = value as AnyObject
    }
}
 Dalija Prasnikar23 нояб. 2017 г., 12:05
Я знаю, что это не совсем отвечает на вопрос, и я мучаюсь из-за одной и той же проблемы в течение длительного времени. Мне бы очень хотелось увидеть правильный ответ на ваш вопрос :)
 Gregory Higley23 нояб. 2017 г., 00:42
Вам не нужноT: Any, простоT будет работать. Помимо этого, это работает хорошо и очень похоже на мое решение, хотя мне нравится ваше больше. Строго говоря, это не отвечает на вопрос, но я думаю, что это самое близкое, что мы собираемся получить.
 Dalija Prasnikar23 нояб. 2017 г., 12:02
Да, я оставил это для образовательных целей ... Может быть, я должен упомянуть об этом.

Ваш ответ на вопрос