I could be wrong, but I think you don't need an associated type for this scenario.
protocol MyClassObserver: AnyObject {
func myClassDidSomething(_ instance: MyClass)
}
protocol Observable {
var observers: [ObjectIdentifier: AnyObject] { get set }
}
extension Observable {
mutating func addObserver(_ observer: AnyObject) {
let id = ObjectIdentifier(observer)
observers[id] = observer // (we'd toss some weak-boxing in here too)
}
}
class MyClass : Observable {
var observers: [ObjectIdentifier : AnyObject] = [ObjectIdentifier : MyClassObserver]()
}