델리게이트 사용하기 위해 프로토콜을 선언하고 있었는데 Class Delegate Protocol Violation 경고가 나타났습니다. ( swiftLint 적용중입니다.)
Delegate 로 설계된 protocol이 클래스 전용으로 선언되지 않았기 때문입니다..
Delegate는 일반적으로 사용하는 쪽에서 옵셔널 타입으로 선언합니다. 그 이유는 약한 참조로 선언해야 delegate가 메모리에서 해제될 때 더 이상 호출되지 않도록 할 수 있기 때문입니다. 서로가 강한 참조를 갖고 있다면 retain cycle이 발생될 수 있습니다. 이렇게 될 경우 한쪽에서만 해제가 된다해도 다른쪽에서 참조를 하고 있기 때문에 메모리에 계속해서 불필요한 인스턴스가 할당되어 있습니다. 이는 memory leak를 발생시킵니다.
다시 돌아와서,, 프로토콜은 클래스가 아닌 구조체에서도 선언될 수 있습니다. 클래스가 아닌곳에서 이 프로토콜이 준수될 경우 약한 참조가 지원되지 않을 수 있기에 클래스 전용으로 프로토콜을 제한해야 합니다.
근데 더이상 class 전용으로 프로토콜을 제약하는 것이 권장되지 않다고 나와있습니다. 그래서 어느 class 타입이든 준수할 수 있는 AnyObject를 사용하면 됩니다.