swiftdelegatesswift-protocols

How can I make a weak protocol reference in 'pure' Swift (without @objc)


weak references don't seem to work in Swift unless a protocol is declared as @objc, which I don't want in a pure Swift app.

This code gives a compile error (weak cannot be applied to non-class type MyClassDelegate):

class MyClass {
  weak var delegate: MyClassDelegate?
}

protocol MyClassDelegate {
}

I need to prefix the protocol with @objc, then it works.

Question: What is the 'pure' Swift way to accomplish a weak delegate?


Solution

  • You need to declare the type of the protocol as AnyObject.

    protocol ProtocolNameDelegate: AnyObject {
        // Protocol stuff goes here
    }
    
    class SomeClass {
        weak var delegate: ProtocolNameDelegate?
    }
    

    Using AnyObject you say that only classes can conform to this protocol, whereas structs or enums can't.