프로토콜과 AnyObject

임혜정·2024년 9월 30일
0

1. AnyObject 프로토콜

모든 클래스 타입이 암시적으로 준수하는 프로토콜
클래스 타입만 AnyObject를 준수할 수 있다

2. 클래스 전용

AnyObject를 상속받은 프로토콜은 클래스만 채택할 수 있다.
구조체, 열거형은 이 프로토콜을 채택할 수 없음

protocol SomeProtocol: AnyObject {
    // 프로토콜 정의
}
  1. 프로토콜 확장과 AnyObject:

    extension SomeProtocol where Self: AnyObject {
        // 클래스 전용 구현
    }
    • 프로토콜 확장에서 AnyObject 제약을 사용하여 클래스 전용 기능을 구현할 수 있습니다.
  2. 약한 참조와 프로토콜:

    weak var delegate: SomeProtocol?
    • 프로토콜 타입을 약한 참조로 사용하려면, 해당 프로토콜이 AnyObject를 상속해야 합니다.
  3. 성능 최적화:

    • 클래스 전용 프로토콜은 컴파일러가 더 효율적인 코드를 생성할 수 있게 합니다.
    • 동적 디스패치 대신 직접 메서드 호출이 가능해져 성능이 향상될 수 있습니다.
  4. 타입 캐스팅:

    • AnyObject는 모든 클래스 타입의 인스턴스를 나타낼 수 있어, 다운캐스팅에 유용합니다.
    func someFunction(obj: AnyObject) {
        if let specificObject = obj as? SpecificClass {
            // SpecificClass로 작업
        }
    }
  5. Objective-C 상호운용성:

    • AnyObject는 Objective-C의 id 타입과 브리징됩니다.
    • Objective-C API와 작업할 때 유용합니다.
  6. 프로토콜 조합:

    func someFunction(obj: SomeProtocol & AnyObject) {
        // obj는 SomeProtocol을 준수하는 클래스 인스턴스
    }
    • AnyObject를 다른 프로토콜과 조합하여 사용할 수 있습니다.

이러한 개념들은 Swift에서 타입 안전성을 유지하면서 유연한 프로그래밍을 가능하게 합니다. 클래스 전용 기능이 필요한 경우나 참조 타입의 특성을 활용해야 할 때 AnyObject와 프로토콜의 조합을 효과적으로 사용할 수 있습니다.

profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️

0개의 댓글