Class-only protocol as typealias for associatedtype with AnyObject constraints

385 Views Asked by At

In Swift 4.0 I could write something like this

protocol ObserversHolder {

    ///Compiling Error in Swift 4.1
    ///note: possibly intended match 'StringManager.ObserverValue' (aka 'StringObserver') does not conform to 'AnyObject'
    ///note: protocol requires nested type 'ObserverValue'; do you want to add it?
    associatedtype ObserverValue: AnyObject

    var observers: [ObserverValue] {get set}
}

protocol StringObserver: class {
    func showString()
}

class StringManager: ObserversHolder {
    typealias ObserverValue = StringObserver

    var observers = [ObserverValue]()
}

But in Swift 4.1 I receive the error Type 'StringManager' does not conform to protocol 'ObserversHolder'.

Is it possible to resolve this?

1

There are 1 best solutions below

1
On

Change AnyObject to Any

protocol ObserversHolder {

    ///Compiling Error in Swift 4.1
    ///note: possibly intended match 'StringManager.ObserverValue' (aka 'StringObserver') does not conform to 'AnyObject'
    ///note: protocol requires nested type 'ObserverValue'; do you want to add it?

    associatedtype ObserverValue: Any

    var observers: [ObserverValue] {get set}
}

protocol StringObserver: class {
    func showString()
}

class StringManager: ObserversHolder {
    typealias ObserverValue = StringObserver

    var observers = [ObserverValue]()
}