[swift] Swift에서 프로토콜의 타입 확인

Swift에서는 프로토콜을 사용하여 타입에 대한 추상화와 다형성을 구현할 수 있습니다. 프로토콜은 클래스, 구조체, 열거형 등 다양한 타입에 적용할 수 있으며, 해당 타입이 프로토콜을 준수하는지 확인할 수도 있습니다.

프로토콜 타입 확인하기

Swift에서는 is 연산자와 as? 연산자를 사용하여 프로토콜 타입을 확인할 수 있습니다.

protocol Printable {
    func print()
}

struct Person: Printable {
    func print() {
        // 출력 로직 구현
    }
}

class Animal: Printable {
    func print() {
        // 출력 로직 구현
    }
}

let person: Printable = Person()
let animal: Printable = Animal()

if person is Printable {
    print("person은 Printable 프로토콜을 준수합니다.")
} else {
    print("person은 Printable 프로토콜을 준수하지 않습니다.")
}

if animal is Printable {
    print("animal은 Printable 프로토콜을 준수합니다.")
} else {
    print("animal은 Printable 프로토콜을 준수하지 않습니다.")
}

위의 예제에서는 Printable 프로토콜을 정의한 후, Person 구조체와 Animal 클래스가 Printable 프로토콜을 준수하도록 구현하였습니다. 이후 personanimal의 타입을 Printable로 선언하고, is 연산자를 사용하여 해당 타입이 Printable 프로토콜을 준수하는지 확인합니다.

다운캐스팅을 통한 프로토콜 타입 사용하기

프로토콜 타입을 사용할 때, 해당 타입의 구체적인 타입으로 다운캐스팅하여 사용할 수도 있습니다. 이때 as? 연산자를 사용하여 다운캐스팅하여 실패할 경우 nil을 반환하도록 할 수 있습니다.

protocol Eatable {
    func eat()
}

class Fruit: Eatable {
    func eat() {
        // 먹는 로직 구현
    }
}

class Meat: Eatable {
    func eat() {
        // 먹는 로직 구현
    }
}

let fruit: Eatable = Fruit()
let meat: Eatable = Meat()

if let fruit = fruit as? Fruit {
    print("과일을 먹습니다.")
    fruit.eat()
} else if let meat = meat as? Meat {
    print("고기를 먹습니다.")
    meat.eat()
}

위의 예제에서는 Eatable 프로토콜을 정의한 후, Fruit 클래스와 Meat 클래스가 Eatable 프로토콜을 준수하도록 구현하였습니다. 이후 fruitmeat의 타입을 Eatable로 선언하고, as? 연산자를 사용하여 해당 타입으로 다운캐스팅하여 사용합니다.

참고 자료