본문 바로가기
Swift

[Swift] AnyObject 프로토콜 상속과 Any/AnyObject 사용을 지양하는 이유

by Jimmy_iOS 2023. 6. 13.

Swift에서는 타입 안정성을 지향하기 때문에 Any/AnyObject를 사용하는 것은 지양됩니다. 이는 코드를 컴파일 시에 타입 안정성을 보장하기 위함입니다.

따라서, 가능하면 Any/AnyObject 대신에 구체적인 타입을 사용하는 것이 좋습니다. 그러나, 어떤 경우에는 클래스 인스턴스만 해당 프로토콜을 채택할 수 있도록 지정해야 할 때가 있습니다. 예를 들어, 다음과 같은 프로토콜이 있다고 가정해봅시다.

protocol MyProtocol: AnyObject {
    func myFunction()
}

이 프로토콜은 AnyObject 프로토콜을 상속하고 있기 때문에, 해당 프로토콜을 채택하는 클래스 인스턴스만 프로토콜을 채택할 수 있습니다. 따라서, 이 경우에는 Any/AnyObject 대신에 클래스 인스턴스 타입을 사용해야 합니다.

class MyClass: MyProtocol {
    func myFunction() {
        print("Hello, world!")
    }
}

하지만, 이는 해당 프로토콜이 AnyObject 프로토콜을 상속하는 경우에만 해당됩니다. 만약 다른 프로토콜을 상속하는 경우에는 여전히 Any/AnyObject 사용을 지양해야 합니다.

protocol MyOtherProtocol {
    func myOtherFunction()
}

class MyOtherClass: MyOtherProtocol {
    func myOtherFunction() {
        print("Hello, world!")
    }
}

let anyObjectInstance: AnyObject = MyOtherClass()
// 이 경우에는 AnyObject 타입을 사용해도 무방합니다.
// 다만, 가능하면 구체적인 타입을 사용하는 것이 좋습니다.
let myOtherInstance: MyOtherProtocol = anyObjectInstance as! MyOtherProtocol
myOtherInstance.myOtherFunction()

따라서, 코드를 작성할 때에는 프로토콜이 어떤 프로토콜을 상속하는지에 대해 주의깊게 살펴봐야 합니다.

이상이 Swift에서 Any/AnyObject 사용 지양과 AnyObject 프로토콜 상속에 대한 내용입니다.